?
WM_CONCAT(colName)為Oracle 10g中行數據轉列數據的內置函數,執行效果如下
表T
A B
------------
1 2
1 3
1 4
2 1
2 3
執行語句 :
SELECT A, WM_CONCAT(B) B FROM T GROUP BY A
執行結果:
A B
---------------
1 2,3,4
2 1,3
?
注意:
當在包體內使用行轉列時,WM_CONCAT(colName)可以使用,但WM_CONCAT(DISTINCT?colName)會在包編譯時會報錯,
例如,在某一包的某一存儲過程中有如下語句:
1 UPDATE D_LOWAREA L 2 SET L.BYQXH = ( SELECT /* +index(b) */ 3 WM_CONCAT( DISTINCT XH.XHMC) 4 FROM OLIVE.OL$_ASSOCIATIONS A, 5 PMSBI.F_SB_SBXX_BASIC B, 6 PMSBI.D_XH XH 7 WHERE A.A IN (L.PDBYQ1, L.PDBYQ2, L.PDBYQ3) 8 AND A.B = B.SBBH 9 AND B.XHDM != ' wz ' 10 AND B.XHDM = XH.XHDM); 11 COMMIT ;
?
? ? ? 編譯時會報如下錯誤:
? ? ?PL/SQL:ORA-30482:DISTINCT option not allowed for this function.
?
解決方案:
使用動態SQL(字符串中有單引號由兩個單引號表示):
1 EXECUTE IMMEDIATE 2 ' UPDATE D_LOWAREA L 3 SET L.BYQXH = (SELECT /*+index(b)*/ 4 WMSYS.WM_CONCAT(DISTINCT XH.XHMC) 5 FROM OLIVE.OL$_ASSOCIATIONS A, 6 PMSBI.F_SB_SBXX_BASIC B, 7 PMSBI.D_XH XH 8 WHERE A.A IN (L.PDBYQ1, L.PDBYQ2, L.PDBYQ3) 9 AND A.B = B.SBBH 10 AND B.XHDM != '' wz '' 11 AND B.XHDM = XH.XHDM) ' ; 12 COMMIT ;
?
PS:Oracle 11g以上版本可以用LISTAGG實現行轉列,寫法如下:
SELECT A, LISTAGG(B, ' , ' ) WITHIN GROUP ( ORDER BY B) B FROM T GROUP BY A
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
