在使用oracle查詢時經常會遇到将某列的多個值轉化為一行顯示的情況,例如如下情況:
employinfo:
-----------------------------------------------------
deptno nameage
-----------------------------------------------------
10 jerry 24
20 tom 26
30 lili 25
10 blue 21
30 prince 30
10 angela 28
-----------------------------------------------------
現需要以如下方式彙總部門人員資訊
---------------------------------------------------------------
deptno employeeinfo
---------------------------------------------------------------
10 jerry(24),blue(21),angela(28)
20 tom(26)
30 lili(25),prince(30)
---------------------------------------------------------------
oracle提供了兩個函數可以很友善的實作列轉行資訊彙總,這兩個函數分别是vm_concat和listagg,接下來我們一起看看其使用方法。
使用vm_concat函數實作:
SELECT deptno, wm_concat (name || '(' || age || ')') employeeinfo
FROM employinfo
GROUP BY deptno
ORDER BY deptno;
顯示結果:
DEPTNO | EMPLOYEEINFO |
10 | jerry(24),angela(28),blue(21) |
20 | tom(26) |
30 | lili(25),prince(30) |
使用listagg函數實作:
SELECT deptno,
listagg (name || '(' || age || ')', ',')
WITHIN GROUP (ORDER BY deptno)
employeeinfo
FROM employinfo
GROUP BY deptno;
顯示結果:
DEPTNO | EMPLOYEEINFO |
10 | angela(28)/blue(21)/jerry(24) |
20 | tom(26) |
30 | lili(25)/prince(30) |
兩個函數函數都可以将列轉化為行顯示,但是在連接配接列值時有所不同,vm_concat(column)函數隻有一個參數,就是需要拼接的列,其預設拼接字元串為‘,’。而listagg(column,[字元])可以指定拼接字元(可以指定為‘,’、‘/’等)。