最近有接觸到Oracle UNPIVOT,PIVOT,WMSYS.WM_CONCAT,以免忘記,整理如下:
--------------------------------------
UNPIVOT的用法:
原始資料如下圖:
現在要將資料轉換成如下格式:
將資料按照INQTY,OUTQTY,REMAININGQTY三個欄位進行列轉行的處理.實現上面的轉換,使用的函數是UNPIVOT,具體實現代碼如下:
SELECT WEEKLY, ML, CVE, ITEMS, ITEM, QUANTITY
FROM TESTP UNPIVOT(QUANTITY FOR ITEM IN(INQTY, OUTQTY, remainingqty))
WHERE ID = '1';
-----------------------------------------------
PIVOT的用法:
如果原始資料是如下圖這樣:
希望資料按照如下圖片顯示:
首先將資料根據INQTY,OUTQTY,REMAININGQTY三個欄位進行列轉行的處理,然後再根據Weekly欄位做行轉列的處理.具體實現代碼如下:
SELECT *
FROM (SELECT WEEKLY, ML, CVE, ITEMS, ITEM, QUANTITY
FROM TESTP UNPIVOT(QUANTITY FOR ITEM IN(INQTY,OUTQTY,remainingqty))
WHERE ID = '1') PIVOT(SUM(QUANTITY) FOR WEEKLY IN('W150826','W150827'))
ORDER BY ML, CVE, ITEMS;
需要注意的是,PIVOT函數中的紅色字體部分只能是聚合函數,綠色字體部分不能是動態的字串[就是不能直接填寫一個欄位放在該處].
--------------------------------------------
WMSYS.WM_CONCAT的用法:
原始資料如下圖:
希望資料按ID,WEEKLY,ML,CVE group by 彙總,多個items以逗號分隔,顯示在一個單元格里面:
具體實現代碼如下:
SELECT ID, weekly, ml, cve, to_char(WMSYS.WM_CONCAT(items))
FROM TESTP
WHERE ID = '1'
GROUP BY ID, weekly, ml, cve
ORDER BY weekly;