2014-03-05 61 views
0

我在SQL下表:轉換列表表矩陣表中的SQL

Name | Date | Property | Value 
------------------------------------ 
Name1 | Date1 | PropertyA | Value11A 
Name1 | Date1 | PropertyB | Value11B 
Name1 | Date2 | PropertyA | Value12A 
Name1 | Date2 | PropertyB | Value12B 
Name2 | Date1 | PropertyA | Value21A 
Name2 | Date1 | PropertyB | Value21B 
Name2 | Date2 | PropertyA | Value22A 
Name2 | Date2 | PropertyB | Value22B 
------------------------------------ 

,並想有以下的輸出:

Name | Date | PropertyAValue | PropertyBValue 
----------------------------------------------- 
Name1 | Date1 | Value11A  | Value11B 
Name1 | Date2 | Value12A  | Value12B 
Name2 | Date1 | Value21A  | Value21B 
Name2 | Date2 | Value22A  | Value22B 

我建造的東西,有很多工作select/where語句。但是一旦你有10個屬性,查詢會變得非常沉重。您能否請您提供更有效的幫助?

編輯:我在Oracle上。我也查看了pivot函數,但它只適用於聚合值,但我不聚合任何東西只重新格式化表並將一個值作爲列。

+2

使用'PIVOT' ,... http://technet.microsoft.com/en-us/library/ms177410(v = sql.105).aspx –

+0

請添加您正在使用的數據庫服務器的標籤... Oracle,MySQL。 。? –

回答

1

PIVOT可以在SQL Server可以用來實現你想要什麼:

SELECT Name, Date, [PropertyA] AS PropertyAValue , [PropertyB] AS PropertyBValue 
FROM 
(SELECT * FROM your_table) p 
PIVOT 
(
    MAX(Value) 
    FOR Property IN ([PropertyA],[PropertyB]) 
) AS pvt 

這裏是SQL Fiddle

這是Oracle等同於上面的查詢代碼:

SELECT * 
FROM (SELECT Name, Date1, Property, Value 
     FROM your_table) 
PIVOT (MAX(Value) FOR (Property) IN ('PropertyA' AS PropertyA, 'PropertyB' AS PropertyB)) 
ORDER BY Name, Date1; 

這裏是代碼SQL Fiddle

+0

謝謝,不幸的是這對Oracle不起作用。 – evgeni

+0

歡迎,您可以嘗試在Oracle中使用'PIVOT' –

+0

只有在聚合值時纔有效,但我只需重新構建表即可單獨使用所有值。 – evgeni