前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle行转列语法总结大全

Oracle行转列语法总结大全

作者头像
数据和云
发布2021-03-15 17:12:46
5.4K0
发布2021-03-15 17:12:46
举报
文章被收录于专栏:数据和云数据和云

墨墨导读:本文来自墨天轮用户“只是甲”的投稿,总结所有Oracle行转列的语法,供大家参考学习。

墨天轮主页:https://www.modb.pro/u/372619

注:本文测试以Oracle 11g下的scoot schema为例。

需求:求emp表各个岗位的工资之和,若无,用0代替。

一、decode语法

代码语言:javascript
复制
SELECT deptno,
       nvl(SUM(decode(job, 'MANAGER', sal)), 0) s_MANAGER,
       nvl(SUM(decode(job, 'ANALYST', sal)), 0) s_ANALYST,
       nvl(SUM(decode(job, 'CLERK', sal)), 0) s_CLERK,
       nvl(SUM(decode(job, 'PRESIDENT', sal)), 0) s_PRESIDENT,
       nvl(SUM(decode(job, 'SALESMAN', sal)), 0) s_SALESMAN
  FROM emp
GROUP BY deptno;

二、CASE语法

代码语言:javascript
复制
SELECT deptno,
       nvl(sum(case when job = 'MANAGER' then sal else 0 end),0)  s_MANAGER,
       nvl(sum(case when job = 'ANALYST' then sal else 0 end),0)  s_ANALYST,
       nvl(sum(case when job = 'CLERK' then sal else 0 end),0)    s_CLERK,
       nvl(sum(case when job = 'PRESIDENT' then sal else 0 end),0)  s_PRESIDENT,
       nvl(sum(case when job = 'SALESMAN' then sal else 0 end),0)  s_SALESMAN
  FROM emp
 GROUP BY deptno;

三、PIVOT语法

代码语言:javascript
复制
WITH p AS
 (SELECT deptno, job, sal FROM emp)
SELECT *
  FROM p pivot(SUM(sal) FOR job IN('MANAGER' AS s_MANAGER,
                                   'ANALYST' AS s_ANALYST,
                                   'CLERK' AS s_CLERK,
                                   'PRESIDENT' AS s_PRESIDENT,
                                   'SALESMAN' AS s_SALESMAN));

不过这个地方null值没有替换成0,要通过nvl再转换一下。

代码语言:javascript
复制
WITH p AS
 (SELECT deptno, job, sal FROM emp),
tmp AS
 (SELECT *
    FROM p pivot(SUM(sal) FOR job IN('MANAGER' AS s_MANAGER,
                                     'ANALYST' AS s_ANALYST,
                                     'CLERK' AS s_CLERK,
                                     'PRESIDENT' AS s_PRESIDENT,
                                     'SALESMAN' AS s_SALESMAN)))
SELECT deptno,
       nvl(s_MANAGER, 0) s_MANAGER,
       nvl(s_ANALYST, 0) s_ANALYST,
       nvl(s_CLERK, 0) s_CLERK,
       nvl(s_PRESIDENT, 0) s_PRESIDENT,
       nvl(s_SALESMAN, 0) s_SALESMAN
  FROM tmp

小结:

decode 语法简单,Oracle独有。 case sql标准语法。 pivot 语法最为简单,Oracle、sqlserver、postgresql均可以使用。

下面再来讲讲wm_concat、listagg、xmlagg。

需求:部门编号为20的所有的员工信息,以行的形式显示。

四、wm_contact语法

代码语言:javascript
复制
SELECT T.DEPTNO, wm_concat(t.ename) names
  FROM EMP T
 WHERE T.DEPTNO = '20'
 GROUP BY T.DEPTNO;

五、listagg语法

代码语言:javascript
复制
SELECT T.DEPTNO,
       listagg(T.ENAME, ',') WITHIN GROUP(ORDER BY T .ENAME) names
  FROM EMP T
 WHERE T.DEPTNO = '20'
 GROUP BY T.DEPTNO;

六、xmlagg语法

代码语言:javascript
复制
SELECT T.DEPTNO,
       xmlagg(XMLELEMENT(T, ',',T.ENAME) ORDER BY T .ENAME).EXTRACT ('//text()') names
  FROM EMP T
 WHERE T.DEPTNO = '20'
 GROUP BY T.DEPTNO;

小结:

wm_concat 语法最简单,但是默认是 clob列,plsql不容易导出。 listtagg 语法稍微复杂,但是默认是字符串,性能会比wm_concat 好,但是超过4000个字符,受限制。 xmlagg 字符串超过4000字符,就需要使用xmlagg。

作者

曾庆顺,10年数据库运维、数据仓库及大数据经验,擅长Oracle、MySQL、Hive,具有Oracle 10g OCP,Linux RHCE,长期服务于通信、金融信贷行业。

墨天轮原文链接:https://www.modb.pro/db/26033

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据和云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、decode语法
  • 二、CASE语法
  • 三、PIVOT语法
  • 小结:
  • 四、wm_contact语法
  • 五、listagg语法
  • 六、xmlagg语法
  • 小结:
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档