oracle 函数 实现行转列

来源:互联网 发布:平稳时间序列数据下载 编辑:程序博客网 时间:2024/06/06 02:13

oracle 函数实现行转列(多行转成一列)

二次修正时间:20170117新增内容:增加另一种方法

需求
列出雇员表中同属一个部门的雇员名称和部门号

select t.DEPTNO 部门号, t.NAME 姓名 from employee t;

结果

   部门号 姓名    10 CLARK    10 KING    10 MILLER    20 ADAMS    20 FORD    20 JONES    20 SCOTT    20 SMITH    30 ALLEN    30 BLAKE    30 JAMES    30 MARTIN    30 TURNER    30 WARD

借助oracle提供的wmsys.wm_concat()函数,可以方便的实现归并同一组的数据,看一下用法
方法一

select t.DEPTNO 部门号, WMSYS.WM_CONCAT(t.NAME) 姓名 From employee GROUP BY t.DEPTNO;

实现结果

    部门号 姓名    10 CLARK, KING, MILLER    20 ADAMS, FORD, JONES, SCOTT, SMITH    30 ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD

方法二
LISTAGG函数由11gr2引入,使得字符串聚合操作更加容易。并且允许我们制定排序规则。
使用方法如下

SELECT ORG_ID,LISTAGG(ORG_NAME,',') WITHIN GROUP (ORDER BY ORG_NAME) AS "机构名称"FROM(SELECT '000000' ORG_ID,'小青菜' ORG_NAME,1 ORG_LEVEL FROM DUAL UNION ALLSELECT '000000','小白',3 FROM DUAL UNION ALLSELECT '000000','鼠',2  FROM DUAL )GROUP BY ORG_ID;

结果

ORG_ID  机构名称000000  小白,小青菜,鼠

注意看一下,中间有一个order by 排序,现在改变一下排序字段

SELECT ORG_ID,LISTAGG(ORG_NAME,',') WITHIN GROUP (ORDER BY ORG_LEVEL)FROM(SELECT '000000' ORG_ID,'小青菜' ORG_NAME,1 ORG_LEVEL FROM DUAL UNION ALLSELECT '000000','小白',3 FROM DUAL UNION ALLSELECT '000000','鼠',2  FROM DUAL )GROUP BY ORG_ID;

结果

ORG_ID  机构名称000000  小青菜,鼠,小白

其实还有很多种方法,我这里贴出地址,仅供大家研究

http://www.2cto.com/database/201501/369045.html
0 0
原创粉丝点击