2013-03-20 30 views
1

我有我行轉成怎樣我的表結構從DB2 table.This列..樞轉在DB2

ItemID Item Value 
--------------------- 
1  Meeting  Now 
1  Advise  Yes 
1  NoAdvise No 
2  Meeting  Never 
2  Advise  No 
2  NoAdvise Null 
2  Combine Yes 

我想這被轉變爲(注意,我不想轉置合併)

ItemID Meeting Advise NoAdvise 
--------------------------------------- 
1   Now  Yes  No 
2   Never No  Null 

位掙扎着查詢,你能幫忙嗎?

回答

1

這不是很漂亮,但它應該工作。 DB2沒有像SQL Server一樣的內置PIVOT函數。

​​3210
0

正如@bhamby所說的,DB2沒有PIVOT函數。
大多數情況下,我的查詢只是檢索結果的方式不同 - 您需要在其上運行profiler/optimizer以確保它正確,但我相信相關的子查詢可能會按行執行(可能效率較低),而不是集合。這不太可能是小數據集的問題。

WITH Item (id) as (SELECT DISTINCT itemId 
        FROM YourTable), 
SELECT item.id, Meeting.meeting, Advise.advise, NoAdvise.noadvise 
FROM Item 
LEFT JOIN (SELECT itemId, value as meeting 
      FROM YourTable 
      WHERE item = 'Meeting') as Meeting 
     ON Meeting.itemId = Item.id 
LEFT JOIN (SELECT itemId, value as advise 
      FROM YourTable 
      WHERE item = 'Advise') as Advise 
     ON Advise.itemId = Item.id 
LEFT JOIN (SELECT itemId, value as noadvise 
      FROM YourTable 
      WHERE item = 'NoAdvise') as NoAdvise 
     ON NoAdvise.itemId = Item.id 

(...其實,我有點擔心,你有兩個「勸」和「不提醒」,這似乎是某種形式的布爾條件列 - 也就是說,你應該有一個,但不是其他)。

1

currently accepted answer by bhamby當然是正確的,但它是值得檢查if using several correlated subqueries is much slower than a single group by(提示:最有可能的是):

SELECT 
    A.ItemID, 
    MAX(CASE WHEN A.Item = 'Meeting' THEN Value END) AS Meeting, 
    MAX(CASE WHEN A.Item = 'Advise' THEN Value END) AS Advise, 
    MAX(CASE WHEN A.Item = 'NoAdvise' THEN Value END) AS NoAdvise 
FROM A 
GROUP BY A.ItemID 

這也是在我看來有點簡單

SQLFiddle(在PostgreSQL的,但作品在DB2 LUW上)