使用oracle內置函數合併多行數據爲一行

oracle多行合併成一行

使用vm_concat() 函數

-----------------------------------------
u_id             goods            num
------------------------------------------
1                蘋果               2
2                梨子               5
1                西瓜               4
3                葡萄               1
3                香蕉               1
1                橘子               3
--查詢語句
select u_id, wmsys.wm_concat(goods) goods_merge, wm_concat(goods) goods_mg
from shopping   
group by u_id  

結果

--------------------------------
u_id           goods_merge  
--------------------------------
1              蘋果,西瓜,橘子
2              梨子
3              葡萄,香蕉
---------------------------------

select u_id, 
wmsys.wm_concat(goods || '(' || num || '斤)' ) goods_sum   
from shopping   
group by u_id
--------------------------------
u_id           goods_sum
--------------------------------
1              蘋果(2斤),西瓜(4斤),橘子(3斤)
2              梨子(5斤)
3              葡萄(1斤),香蕉(1斤)
---------------------------------

listagg()函數

基本語法:listagg(xxx,xxx) within group( order by xxx)
可以配合 group by進行聚合查詢,也可以配合 partition by進行聚合查詢。

TEST_USER 表記錄如下
在這裏插入圖片描述
TEST_RECORD 表記錄如下:
在這裏插入圖片描述

使用group by

SELECT u.ID, u.NAME, LISTAGG(r.VALUE, ',') WITHIN GROUP (ORDER BY r.VALUE) AS AGG_VALUES
FROM TEST_USER u 
LEFT JOIN TEST_RECORD r ON u.ID = r.ID
WHERE r.TAG IN ('start', 'end')
GROUP BY u.ID, u.NAME;

在這裏插入圖片描述

使用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 JOIN TEST_RECORD r ON u.ID = r.ID
WHERE r.TAG IN ('start', 'end');

在這裏插入圖片描述

兩者相似之處

  • 都能實現聚合查詢同樣的結果
  • 都需要 ORDER BYLISTAGG的對象進行排序。
  • WITHIN GROUP可以對聚合後的單元內 (如上例中的 1,3) 元素進行排序, ORDER BY的字段任意,並不僅限於要進行聚合操作的字段。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章