listagg() : Oracle的列轉行函數(1oracle11.2 以上版本.)
語法:
listagg(id, ',') within group(order by serno)
listagg(列名,' 分割符號') within group(order by 列值被拼接的順序)
1.使用條件查詢 查詢部門為20的員工列
2.使用 listagg() WITHIN GROUP () 將多行合並成一行(比較常用)
3. 使用 listagg() within GROUP () over 將多行記錄在一行顯示(沒有遇到過這種使用場景)
二、同 wm_concat() 函數的區別:
使用 wm_concat 函數,記得加上to_char. 不然會展現成 CLOB 字段.
個人建議: 11g 版本后使用 listagg 函數. 之前版本使用 wm_concat 函數.
三、group by和partition by 的區別
group by 后的列必須是查詢的分組全部列.
partition by 查出的結果集是重復的,需要使用 distinct 進行顯式去重.
對於查詢結果非常復雜的業務場景,個人感覺使用 PARTITION BY 會更靈活一些;GROUP BY 由於其查詢結果列必須出現在 GROUP BY 條件里邊而顯得有些臃腫,不夠優雅。partition by 可以理解為以什么來分區.
LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX),
總結:LISTAGG()把它當作SUM()函數來使用就可以了。