[英]Pivoting in DB2
我必須將行轉換為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
有點掙扎的查詢,請您幫忙嗎?
它不是很漂亮,但是應該可以。 DB2沒有像SQL Server這樣的內置PIVOT
功能。
SELECT DISTINCT
A.ItemID
,(SELECT value
FROM table B
WHERE B.ItemID = A.ItemID
AND B.Item = 'Meeting'
) AS Meeting
,(SELECT value
FROM table B
WHERE B.ItemID = A.ItemID
AND B.Item = 'Advise'
) AS Advise
,(SELECT value
FROM table B
WHERE B.ItemID = A.ItemID
AND B.Item = 'NoAdvise'
) AS NoAdvise
FROM table A
bhamby當前接受的答案當然是正確的,但是值得檢查使用多個相關子查詢是否比單個查詢慢得多 (提示:很可能是):
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)
正如@bhamby所說,DB2沒有PIVOT
功能。
通常,我的查詢在檢索結果的方式上有所不同-您需要對它們運行分析器/優化器以確保結果,但是我相信相關子查詢可能按行執行(可能效率較低),而不是集合。 對於小型數據集,這不太可能成為問題。
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
(...,實際上,我有點擔心您同時具有“建議”和“不建議”列,這似乎是某種布爾條件-即,您應該有一個,但沒有另一個) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.