zoukankan      html  css  js  c++  java
  • 在ORACLE中聚集合并字符串

    sql中有聚集函数sum,但只能计算数值型,如(本文中试验都是在scott用户下):

    SQL> select deptno,sum(sal) asal

    from emp a

    group by deptno;

    DEPTNO ASAL

    30 9400

    20 10875

    10 8750

    有时要想分组查看每个部门的人员列表如下结果:

    DEPTNO ENAME

    -

    10 CLARK,KING,MILLER

    20 SMITH,FORD,ADAMS,SCOTT,JONES

    30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD

    标准sql没有提供这个方法。

    SQL> select deptno,sum(ename) ename

    from emp a

    group by deptno;

    select deptno,sum(ename) ename

    *

    第 1 行出现错误:

    ORA-01722: 无效数字

    oracle10g提供了一个函数wmsys.wm_concat可以实现:

    SQL> select deptno,wmsys.wm_concat(ename) ename

    from emp a

    group by deptno;

    DEPTNO ENAME

    -

    10 CLARK,KING,MILLER

    20 SMITH,FORD,ADAMS,SCOTT,JONES

    30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD

    正是想要的结果。

    但是在10g以下版本怎么办呢?

    在oracle9i可以用connect by 实现,但成本很高:

    SQL> select deptno,substr(max(sys_connect_by_path(ename,‘,‘)),2) ename

    from (select a.*,row_number()over(partition by deptno order by empno) rn from emp a )

    group by deptno

    start with rn=1

    connect by rn-1=prior rn and deptno=prior deptno

    order by deptno;

    DEPTNO ENAME

    -

    10 CLARK,KING,MILLER

    20 SMITH,JONES,SCOTT,ADAMS,FORD

    30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES

    结果也正确。这个sql参考了一下其他人的例子,并用到了分析函数。

    每一天都要行动,在前进中寻求卓越。
  • 相关阅读:
    用同余理解补码
    objenesis
    spring 事务处理
    SOCKS5 协议解析
    WebSocket 的鉴权授权方案
    加密解密基础问题:字节数组和16进制字符串的相互转换
    主机字节序 与 网络字节序
    RSA 理论
    分类算法----k近邻算法
    R语言统计分析应用与SAS、SPSS的比较
  • 原文地址:https://www.cnblogs.com/wshsdlau/p/2579701.html
Copyright © 2011-2022 走看看