oracle中有关listagg函数的使用

oracle中有关listagg的使用

  • 1. 作用
  • 2. 语法
  • 3. 实例
  • 问题拓展

1. 作用

可以实现行转列,将多列数据聚合为一列,实现数据的压缩。

2. 语法

listagg(measure_expr,delimiter) within group ( order by order_by_clause);

解释:
measure_expr可以是基于任何列的表达式;
delimiter分隔符,默认为NULL;
order_by_clause决定了列值的拼接顺序。

3. 实例

1)查询部门编号20的员工

--查询部门编号20的员工,按薪资排序
select deptno,ename,sal from emp where deptno=20  order by sal;

oracle中有关listagg函数的使用_第1张图片

2)普通函数
按薪资排序,结果按逗号拼接
使用listagg() WITHIN GROUP () 将多行合并成一行

--使用listagg() WITHIN GROUP ()  将多行合并成一行
select listagg(ename,',')within group(order by sal)name from emp where deptno=20;

oracle中有关listagg函数的使用_第2张图片
3)分组排序
按部门分组,进行薪资求和。并列出人员清单,按薪资排序,并以,连接汇总显示

select deptno,listagg(ename,',') within group(order by sal)name,sum(sal) from emp group by deptno;

oracle中有关listagg函数的使用_第3张图片

问题拓展

I:字段拼接过程中以0开头的小数,开头的0消失

解决方案:
加上to_char(字段,’fm9999999999999990.00’) (查看表结构设计,这里的类型是number(16,2),所以设置前面小数点前面最多16位,后面保留2位)

II:listagg聚合函数去重

使用正则替换方式去重(仅适用于oracle字符串大小比较小的情况)

regexp_replace(listagg(sfaaua001,',') within group(order by sfea002),'([^,]+)(,\\1)*(,|$)','\\1\\3') sfaaua001

参考资料:
1、文中的示例用表创建语句:https://blog.csdn.net/bananasssss/article/details/121714632?spm=1001.2014.3001.5501

你可能感兴趣的:(Oracle,数据库,oracle,sql,数据库)