Oracle行转列语法总结大全

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

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

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

一、decode语法

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 empGROUP BY deptno;

二、CASE语法

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语法

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再转换一下。

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语法

SELECT T.DEPTNO, wm_concat(t.ename) names FROM EMP T WHERE T.DEPTNO = '20' GROUP BY T.DEPTNO;

五、listagg语法

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语法

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(复制到浏览器打开或者点击“阅读原文”立即查看)

(0)

相关推荐

  • MySQL操作笔记(五万字详解)

    文章目录 前言 MySQL笔记 1.sql.DB.DBMS分别及三者之间的关系 2.什么是表(table) 3.SQL语句分类 4.如何导入数据(sql脚本文件) 5.什么是sql脚本 6.查看表结构 ...

  • 【竺】数据库笔记1

    学习MySQL主要还是学习通用的SQL语句,那么SQL语句包括增删改查,SQL语句怎么分类呢? DQL(数据查询语言): 查询语句,凡是select语句都是DQL. DML(数据操作语言):inser ...

  • Oracle外部表详解

    外部表概述 外部表只能在Oracle 9i之后来使用.简单地说,外部表,是指不存在于数据库中的表.通过向Oracle提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数据库表,就像这些数 ...

  • Excel小技巧:快速调整行高列宽

    大家好,我是梦海,今天要讲的小技巧是根据单元格内容快速调整行高列宽. 正常来说,新建一个工作簿或者工作表,它的所有行高和列宽在初始状态下都是相同的,那么如何根据单元格的内容快速调整呢?我们通过一个例子 ...

  • 〖职场实战〗用Excel数据透视表向导快速提取多行多列不重复值

    Excel情报局 OFFICE 爱好者大本营 用 1% 的Excel 基础 搞定 99%的 职场工作 做一个有价值感的Excel公众号 Excel是门手艺   玩转需要勇气 数万Excel爱好者聚集地 ...

  • 你要的来了!高中英语语法速记大全~

    小可爱们需要哪些学习资料 快在下方留言告诉我哦~

  • 【外语】高中9大英语语法口诀大全,快速记住常用语法

    [高中外语] 一.名词单数变复数规则 [速记口诀] 单数变复数,规则要记住, 一般加s,特殊有几处. [妙语诠释] ①大部分单数可数名词变为复数要加s,也就是单词如果以ch,sh,s,x等结尾),则一 ...

  • 高中9大英语语法口诀大全,快速记住常用语法

    一.名词单数变复数规则 [速记口诀] 单数变复数,规则要记住, 一般加s,特殊有几处. [妙语诠释] ①大部分单数可数名词变为复数要加s,也就是单词如果以ch,sh,s,x等结尾),则一般加es;②以 ...

  • 多行多列数据怎样快速行列互换位置?

    今天是大年初五,迎接财神,祝各位亲们新的一年财源广进,日进斗金,恭喜发财! Excel里数据转置功能可能很多人用过,先复制,再选择性粘帖,把"转置"打勾就可以,如图1: 图 1 然 ...

  • 行多列少,打印莫烦恼

    工作中有时候会遇到一些行数很多而列数较少的表格需要打印,由于列数很少,行数多,如图1 ,表格只有2列,行数有几百行.打印在纸上内容集中在纸张左侧了,这样打印会浪费纸张. 图 1 如果在Excel 中排 ...

  • Excel表格如何将一列数字快速分成几行几列?

    Excel表格如何将一列数字快速分成几行几列?这个问题在Excel中用函数解起来也不复杂,但是,正如很多开始用Power Query的朋友说,自从学了Power Query,什么问题都首先想着用Pow ...

  • 怎么将多行多列的数据变成一列?4个解法。

    - 问题 -怎么将这个多行多列的数据变成一列? - 1 - 不需保持原排序选中所有列逆透视,一步搞定 - 2 - 保持原排序:操作法一思路直接,为保排序,操作麻烦2.1 添加索引列 2.2 替换nul ...