Oracle-11g新函数LISTAGG⾏转列
现在oracle数据库都在⽤11g的了,oracle也推出了⾏转列的函数LISTAGG ,我们⽤惯了10g的内部函数了,出于安全考虑,⼤家还是⽤新的LISTAGG 函数吧。先说下这个函数的⽤法。
帮助⽂档位置在SQL Language Reference->Functions->LISTAGG
函数签名中的measure_expr为分组中每个列的表达式,⽽delimiter为合并分割符。如果delimiter不设置的话,就表⽰⽆分割符。中间within group后⾯的order_by_clause表⽰的是进⾏合并中要遵守的排序顺序。
⽽后⾯的over⼦句表明listagg是具有分析函数analyze funcation特性的。
下⾯就演⽰⼏个常⽤的例⼦。
SQL>
SQL> SELECT  listagg(T.ENAME,',')  within group (order by T.EMPNO) CONCAT FROM EMP T;
CONCAT
--------------------------------------------------
SMITH,ALLEN,WARD,JONES,MARTIN,BLAKE,CLARK,SCOTT,KI
NG,TURNER,ADAMS,JAMES,FORD,MILLER
SQL>
SQL>
SQL> SELECT  T.DEPTNO,listagg(T.ENAME,',')  within group (order by T.EMPNO) CONCAT FROM EMP T  2  GROUP BY T.DEPTNO;
DEPTNO CONCAT
---------- --------------------------------------------------
10 CLARK,KING,MILLER
20 SMITH,JONES,SCOTT,ADAMS,FORD
30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES
SQL>
SQL>
SQL> SELECT T.DEPTNO,T.ENAME,
2    listagg(T.ENAME, ',') within group(order by T.EMPNO) over(partition by T.DEPTNO) as  CONCAT
3  FROM EMP T;
DEPTNO ENAME      CONCAT
-
--------- ---------- --------------------------------------------------
10 CLARK      CLARK,KING,MILLER
10 KING      CLARK,KING,MILLER
10 MILLER    CLARK,KING,MILLER
20 SMITH      SMITH,JONES,SCOTT,ADAMS,FORD
20 JONES      SMITH,JONES,SCOTT,ADAMS,FORD
20 SCOTT      SMITH,JONES,SCOTT,ADAMS,FORD
20 ADAMS      SMITH,JONES,SCOTT,ADAMS,FORD
20 FORD      SMITH,JONES,SCOTT,ADAMS,FORD
30 ALLEN      ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES
30 WARD      ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES
oracle11g 创建数据库30 MARTIN    ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES
DEPTNO ENAME      CONCAT
---------- ---------- --------------------------------------------------
30 BLAKE      ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES
30 TURNER    ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES
30 JAMES      ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES
14 rows selected.
SQL>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。