Oracle拼接同一個字段多行的值


本文引用自-   https://www.cnblogs.com/qianyuliang/p/6649983.html

       https://blog.csdn.net/defonds/article/details/80455816

方法一:vm_concat() 函數

oracle wm_concat(column)函數使我們經常會使用到的,下面就教您如何使用oraclewm_concat(column)函數實現字段合並

如:

shopping:
-----------------------------------------
u_id       goods            num
------------------------------------------
1                蘋果               2
2                梨子               5
1                西瓜               4
3                葡萄               1
3                香蕉               1
1                橘子               3
=======================
 
想要的結果為:
--------------------------------
u_id          goods_sum
--------------------------------
1              蘋果,西瓜,橘子
2              梨子
3              葡萄,香蕉
---------------------------------
 代碼為:select u_id, wmsys.wm_concat(goods) goods_sum   from shopping   group by u_id  
 
 
想要的結果2:
--------------------------------
u_id          goods_sum
--------------------------------
1              蘋果(2斤),西瓜(4斤),橘子(3斤)
2              梨子(5斤)
3              葡萄(1斤),香蕉(1斤)
---------------------------------
代碼為:select u_id, wmsys.wm_concat(goods || '(' || num || '斤)' ) goods_sum   from shopping   group by u_id
 
方法二:listagg()函數

基本語法:listagg(xxx,xxx) within group( order by xxx)。
可以配合 group by進行聚合查詢,也可以配合 partition by進行聚合查詢。
直接上例子。
test_user表記錄如下:

 


test_record 表記錄如下:

 


期望結果:

id name agg_values
111 aaa 1,3
222 bbb 1,2
333 ccc 1,3
配合 group by 查詢語句:

select u.id, u.name, listagg(r.value, ',') within group (order by  r.value) as agg_values
from test_user u left outer join  test_record r on u.id = r.id
where r.tag in ('start', 'end')
group by u.id, u.name;
1
2
3
4
查詢結果:

配合 partition by查詢語句:

select distinct u.id, u.name, listagg(r.value, ',') within group (order by  r.value)
over (partition by u.id )  as agg_values
from test_user u left outer join  test_record r on u.id = r.id
where r.tag in ('start', 'end');
1
2
3
4
查詢結果:

看來二者都能達成同樣的目標。
二者相似之處:

都能實現聚合查詢同樣的結果
都需要 order by 對 listagg 的對象進行排序。within group 可以對聚合后的單元內 (如上例中的 1,3) 元素進行排序,order by的字段任意,並不僅限於要進行聚合操作的字段
二者不同:

group by 查詢結果列必須出現在 group by 后面,不然會有 ORA-00979: not a group by expression 錯誤
 partition by  查出的結果集是重復的 (重復數視符合條件記錄數而定),需要使用 distinct 進行顯式去重
對於查詢結果非常復雜的業務場景,個人感覺使用 partition by 會更靈活一些;group by 由於其查詢結果列必須出現在 group by 條件里邊而顯得有些臃腫,不夠優雅。

 
 
 


免責聲明!

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



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