oracle--多行轉為一行 (listagg函式)
今天遇到將多行轉為一行的一個操作,多謝oracle開發板的 wildwave 提供了比較通用的解決辦法,同時也將自己搜到的這方面資料整理如下,多是用於連線列值的。
String集聚連線技術
需要將多行轉換為一行,例子如下:
基礎資料:
DEPTNO ENAME
---------- ----------
20 SMITH
30 ALLEN
30 WARD
20 JONES
30 MARTIN
30 BLAKE
10 CLARK
20 SCOTT
10 KING
30 TURNER
20 ADAMS
30 JAMES
20 FORD
10 MILLER
預期輸出:
DEPTNO EMPLOYEES
---------- --------------------------------------------------
10 CLARK,KING,MILLER
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
* LISTAGG分析函式(11g Release 2)
* WM_CONCAT內建函式
* 自定義函式
* 使用Ref Cursor實現通用函式
* 使用者自定義聚集函式
* ROW_NUMBER()和SYS_CONNECT_BY_PATH函式(Oracle 9i)
* COLLECT函式(Oracle 10g)
LISTAGG分析函式(11g Release 2)
Oracle 11g Release 2介紹了LISTAGG 函式,使得聚集連線字串變得很容易。並且允許使用我們指定連線串中的欄位順序。使用LISTAGG如下:
COLUMN employees FORMAT A50
SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM emp
GROUP BY deptno;
DEPTNO EMPLOYEES
---------- --------------------------------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
3 rows selected.