在oracle中有两个牛逼的函数,分别是:wmsys.wm_concat和 scott.listagg, 可以实现行列转换,非常简单,也是我们日常开发及运维工作中经常用得到的两个函数。
wm_concat是oracle 10g推出的一个行列转换函数,而
scott.listagg
是oracle 11g中推出的,两者作用一样,但使用上稍有差异。
例子:
我们创建一个员工信息表:EMP,表中有三个字段,分别是:
EMPNO:员工编号
NAME:员工姓名
DEPTNO:部门编号
建表SQL:
create table EMP (empNo varchar(50),name varchar(30),deptNo varchar2(50));
手动插入部分数据:
insert into EMP values('11','ZK01','1');
insert into EMP values('12','ZK02','2');
insert into EMP values('13','ZK03','3');
insert into EMP values('14','ZK04','4');
insert into EMP values('15','ZK05','1');
insert into EMP values('16','ZK06','2');
insert into EMP values('17','ZK07','3');
insert into EMP values('18','ZK08','4');
insert into EMP values('19','ZK09','1');
insert into EMP values('20','ZK10','2');
insert into EMP values('21','ZK11','3');
insert into EMP values('22','ZK12','4');
insert into EMP values('23','ZK13','5');
现在我们的需求是要通过SQL查出每一个部门下都有哪些员工,员工要求在一行展示,员工之间用逗号隔开。
1、函数 wmsys.wm_concat
用法:wmsys.wm_concat(列名),该函数可以把列值用逗号隔开,在一行显示。
select T1.deptno,to_char(wmsys.wm_concat(T1.name)) from emp T1 group by T1.deptno order by T1.deptno asc
结果:已经达我们的预期。
2、函数
scott.listagg
用法:listagg(列名,分隔符) + within group(order by 列名)
select T1.deptno,listagg(T1.name, ',') within group(order by T1.deptno) name from emp T1 group by T1.deptno order by T1.deptno asc
结果:也达到我们的预期。