oracle的wm_concat()方法與的排序問題,Oracle的 listagg 函數


 wm_concat聚合無法直接排序聚合的問題和oracle 11g的新函數listagg。

 

Oracle中的 wm_concat()  函數的使用

功能是:實現行轉列功能,即將查詢出的某一列值使用逗號進行隔開拼接,成為一條數據。

如:

 
select u_id,   to_char(wmsys.wm_concat(name )  )   as name   from thomas   group by charge_code 

 

 
select u_id,   to_char(wmsys.wm_concat(distinct name )  )   as name   from thomas   group by charge_code 

 

 

 

上面需要注意的點事用to_char()轉一下,不然返回的就是clob類型的結果,不夠直觀

select u_id, wmsys.wm_concat(name || '(' || num || '斤)' )  as name    from shopping   group by u_id   
結果顯示為
 

 

 上面charge_code為2的時,有兩個梨子,如何實現 梨子(11)呢?

 

 

=============================================================================

2、需求:

關於wm_concat聚合無法直接排序聚合的問題和oracle 11g的新函數listagg。

3、准備數據:

 

 

需要的結果是這樣,對gradenm列按gradeno列進行排序合並

 

 

4、實現
(1)wm_concat() 聚合,代碼及結果如下:

 

 

 

這個時候很明顯看到,wm_concat默認是沒有辦法給gradenm排序的,當然你可以把from table的部分先查出進行排序,

再進行wm_concat聚合,我只能告訴你這樣並沒有什么卵用。

而且wm_concat默認是用逗號進行字符串拼接,如果需求是別的分隔符,還得用replace去替換一下。

 

(2)嘗試用wm_concat()over(partition by xx order by xx) 分析函數改進,代碼及結果如下:

 

 

 

 

通過分析函數的patition進行分區分組,然后排序是order by gradeno,這樣,嗯。。看結果。然后我們外面套上一層select 查詢這個結果,按schooltype分組,取grade最長的,就可以查到想要的結果了。代碼如下:

select schooltype, max(grade) grade
from (select schooltype, gradeno, wm_concat(gradenm) over(partition by schooltype order by gradeno) grade
from schoolgrade a)
group by schooltype;


 

 

 

(3)當然,不可能就這么結束了,今天的主角其實是listagg函數,

Oracle Database 11g開始提供的一個聚合函數,配合分組實現上面的需求,代碼和結果如下:

--listagg()within group(order by xx) 


select schooltype, listagg(gradenm, '、') within group(order by gradeno) gradenm
from schoolgrade
group by schooltype;


 

 

 

listagg() 可接收兩個參數,聚合列 和 分隔符,不寫分隔符參數即無分隔符直接拼接。

within group(order by xx)里面的就是聚合列拼接順序的排序,用法跟普通排序order by 一樣。

group by,分組,按組統計。有用到分組的才需要。

****************************************

補充:wm_concat是在wmsys用戶下的一個函數,是oracle的一個非公開的函數,而且,wm_concat在前面幾個版本中的返回值數據類型也不相同,在新版本12c中更是直接被拋棄了。

所以,日常開發中並不建議使用wm_concat。強行建議使用listagg。要么就自己寫個函數用。

 

版權聲明:本文為CSDN博主「huay_li」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Huay_Li/article/details/81257655

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM