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 BY
對LISTAGG
的對象進行排序。 WITHIN GROUP
可以對聚合後的單元內 (如上例中的 1,3) 元素進行排序,ORDER BY
的字段任意,並不僅限於要進行聚合操作的字段。