1. 程式人生 > >oracle--多行轉為一行 (listagg函式)

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.