listagg函数

跟10g的wm_concat类似,listagg是11g的聚集函数,但是有4000字符的限制。


转自http://blog.itpub.net/18922393/viewspace-754381


1,测试数据
SQL> 
SQL> select empno,ename,deptno from scott.emp;
 
EMPNO ENAME      DEPTNO
----- ---------- ------
 7369 SMITH          20
 7499 ALLEN          30
 7521 WARD           30
 7566 JONES          20
 7654 MARTIN         30
 7698 BLAKE          30
 7782 CLARK          10
 7788 SCOTT          20
 7839 KING           10
 7844 TURNER         30
 7876 ADAMS          20
 7900 JAMES          30
 7902 FORD           20
 7934 MILLER         10
 
14 rows selected
 
2,作为聚集函数
SQL> SELECT deptno,
  2         LISTAGG(ename, ',') WITHIN GROUP(ORDER BY ename) AS employees
  3    FROM scott.emp
  4   GROUP BY deptno;
 
DEPTNO EMPLOYEES
------ --------------------------------------------------------------------------------
    10 CLARK,KING,MILLER
    20 ADAMS,FORD,JONES,SCOTT,SMITH
    30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
 
SQL> 
--更换排序列
SQL> SELECT deptno,
  2         LISTAGG(ename, ',') WITHIN GROUP(ORDER BY hiredate) AS employees
  3    FROM scott.emp
  4   GROUP BY deptno;
 
DEPTNO EMPLOYEES
------ --------------------------------------------------------------------------------
    10 CLARK,KING,MILLER
    20 SMITH,JONES,FORD,SCOTT,ADAMS
    30 ALLEN,WARD,BLAKE,TURNER,MARTIN,JAMES
--order by必须存在
SQL> SELECT deptno,
  2         LISTAGG(ename, ',') WITHIN GROUP() AS employees
  3    FROM scott.emp
  4   GROUP BY deptno;
 
SELECT deptno,
       LISTAGG(ename, ',') WITHIN GROUP() AS employees
  FROM scott.emp
 GROUP BY deptno
 
ORA-30491: ORDER BY 子句缺失

SQL> SELECT deptno,
  2         LISTAGG(ename, ',') WITHIN GROUP(order by null) AS employees
  3    FROM scott.emp
  4   GROUP BY deptno;
 
DEPTNO EMPLOYEES
------ --------------------------------------------------------------------------------
    10 CLARK,KING,MILLER
    20 ADAMS,FORD,JONES,SCOTT,SMITH
    30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
==〉按字母顺序排列
3,LISTAGG作为分析函数使用
SQL> SELECT empno,
  2         ename,
  3         deptno,
  4         LISTAGG(ename, ',') WITHIN GROUP(ORDER BY ename) over(partition by deptno) AS employees
  5    FROM scott.emp;
 
EMPNO ENAME      DEPTNO EMPLOYEES
----- ---------- ------ --------------------------------------------------------------------------------
 7782 CLARK          10 CLARK,KING,MILLER
 7839 KING           10 CLARK,KING,MILLER
 7934 MILLER         10 CLARK,KING,MILLER
 7876 ADAMS          20 ADAMS,FORD,JONES,SCOTT,SMITH
 7902 FORD           20 ADAMS,FORD,JONES,SCOTT,SMITH
 7566 JONES          20 ADAMS,FORD,JONES,SCOTT,SMITH
 7788 SCOTT          20 ADAMS,FORD,JONES,SCOTT,SMITH
 7369 SMITH          20 ADAMS,FORD,JONES,SCOTT,SMITH
 7499 ALLEN          30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
 7698 BLAKE          30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
 7900 JAMES          30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
 7654 MARTIN         30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
 7844 TURNER         30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
 7521 WARD           30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
 
14 rows selected
4,其他实现方法参考
--model
SQL> SELECT deptno, vals
  2    FROM (SELECT deptno, RTRIM(vals, ',') AS vals, rn
  3            FROM scott.emp MODEL PARTITION BY(deptno) DIMENSION BY(ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY ename) AS rn) MEASURES(CAST(ename AS VARCHAR2(4000)) AS vals) RULES(vals [ ANY ] ORDER BY rn DESC = vals [ CV() ] || ',' || vals [ CV() + 1 ]))
  4   WHERE rn = 1
  5   ORDER BY deptno;
 
    DEPTNO VALS
---------- --------------------------------------------------------------------------------
        10 CLARK,KING,MILLER
        20 ADAMS,FORD,JONES,SCOTT,SMITH
        30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
 
--表函数:WMSYS.WM_CONCAT,10G已经提供该函数
SQL> 
SQL> SELECT deptno, WMSYS.WM_CONCAT(ename) AS vals --<-- WM_CONCAT ~= STRAGG
  2    FROM scott.emp
  3   GROUP BY deptno;
 
DEPTNO VALS
------ --------------------------------------------------------------------------------
    10 CLARK,MILLER,KING
    20 SMITH,FORD,ADAMS,SCOTT,JONES
    30 ALLEN,JAMES,TURNER,BLAKE,MARTIN,WARD

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值