天天看點

Oracle列轉行函數listagg和vm_concat

在使用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;

顯示結果:

Oracle列轉行函數listagg和vm_concat
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;

顯示結果:

Oracle列轉行函數listagg和vm_concat
DEPTNO EMPLOYEEINFO
10 angela(28)/blue(21)/jerry(24)
20 tom(26)
30 lili(25)/prince(30)

兩個函數函數都可以将列轉化為行顯示,但是在連接配接列值時有所不同,vm_concat(column)函數隻有一個參數,就是需要拼接的列,其預設拼接字元串為‘,’。而listagg(column,[字元])可以指定拼接字元(可以指定為‘,’、‘/’等)。