需求是,统计每一个部门不同工种的薪水总和。

SQL> select deptno,ename,job,sal from emp;

    DEPTNO ENAME      JOB              SAL

---------- ---------- --------- ----------

        20 SMITH      CLERK            800

        30 ALLEN      SALESMAN        1600

        30 WARD       SALESMAN        1250

        20 JONES      MANAGER         2975

        30 MARTIN     SALESMAN        1250

        30 BLAKE      MANAGER         2850

        10 CLARK      MANAGER         2450

        20 SCOTT      ANALYST         3000

        10 KING       PRESIDENT       5000

        30 TURNER     SALESMAN        1500

        20 ADAMS      CLERK           1100

        30 JAMES      CLERK            950

        20 FORD       ANALYST         3000

        10 MILLER     CLERK           1300

已选择14行。



SQL> 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;

    DEPTNO  s_MANAGER  s_ANALYST    s_CLERK s_PRESIDENT s_SALESMAN

---------- ---------- ---------- ---------- ----------- ----------

        30       2850          0        950           0       5600

        20       2975       6000       1900           0          0

        10       2450          0       1300        5000          0

SQL> select deptno,

           nvl(sum(case job when 'MANAGER' then sal else null end), 0) "s_MANAGER",

           nvl(sum(case job when 'ANALYST' then sal else null end), 0) "s_ANALYST",

           nvl(sum(case job when 'CLERK' then sal else null end), 0) "s_CLERK",

           nvl(sum(case job when 'PRESIDENT' then sal else null end), 0) "s_PRESIDENT",

           nvl(sum(case job when 'SALESMAN' then sal else null end), 0) "s_SALESMAN"

      from emp

     group by deptno;



    DEPTNO  s_MANAGER  s_ANALYST    s_CLERK s_PRESIDENT s_SALESMAN

---------- ---------- ---------- ---------- ----------- ----------

        30       2850          0        950           0       5600

        20       2975       6000       1900           0          0

        10       2450          0       1300        5000          0

需求是查询每一个部门下的人员信息,在一行显示。在oracle 10g和11g上能够用WMSYS.WM_CONCAT,但值得注意的是此函数是undocument的函数(不是官方发布的函数),oracle不保证升级之后还会存在。

SQL> SELECT deptno, WMSYS.WM_CONCAT(ename) AS employees FROM emp GROUPBY deptno;

DEPTNO EMPLOYEES

---------- --------------------------------------

10 CLARK,MILLER,KING

20 SMITH,FORD,ADAMS,SCOTT,JONES

30ALLEN,JAMES,TURNER,BLAKE,MARTIN,WARD

Oracle 11g后,能够用listagg实现。

SQL> SELECT deptno, LISTAGG(ename, ',') WITHIN

GROUP( ORDER BY ename) AS employees

FROM emp

GROUP BY deptno;

DEPTNO EMPLOYEES

---------- ---------------------------------------

10 CLARK,KING,MILLER

20ADAMS,FORD,JONES,SCOTT,SMITH

30ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

Oracle 简单的列转行的更多相关文章

  1. Oracle 四种列转行的方法

    1. Oracle自带列转行函数listagg: 实例: with temp as( select 'China' nation ,'Guangzhou' city from dual union a ...

  2. Oracle中的列转行实现字段拼接用例

    文章目录 Oracle中的列转行实现字段拼接 场景 在SQL使用过程中经常有这种需求:将某列字段拼接成in('XX','XX','XX','XX','XX','XX' ...)做为查询条件. 实现 s ...

  3. Oracle中的列转行例子详解

    数据如下:name id张三 1,2,3 要求实现:name id张三 1张三 2张三 3 --创建临时表 create table tmp as(select '张三' name, '1,2,3' ...

  4. Oracle wm_concat(列转行函数)实际使用

    接触到了一个开发需求.其中是要把NC单据表体行的字段拼成一个字符串.例如: id name work age 1 王一 搬运工 20 2 李二 清洁工 21 3 张三 洗脚工 22 出现结果字符串为: ...

  5. oracle wm_concat函数 列转行 分组函数

    (1)select mark, wm_concat(status) from DISSENT_INFO t GROUP BY mark; 查出来的数据 mark     status 222      ...

  6. Oracle行转列、列转行的Sql语句总结

    多行转字符串 这个比较简单,用||或concat函数可以实现  SQL Code  12    select concat(id,username) str from app_userselect i ...

  7. Oracle行转列、列转行的Sql语句总结(转)

    多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str f ...

  8. oracle 行转列、列转行

    最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle  列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max ...

  9. oracle中行转列、列转行函数

    多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str ...

随机推荐

  1. angular6 NG-ZORRO 的使用

    1:关于 NG-ZORRO中使用它自己组件改变样式时得使用样式穿透 “class” :: ng-deep "class"

  2. 什么是vuejs之重新认识vuejs

    什么是vuejs? 1.它是一个轻量级的mvvm框架 2.数据驱动+组件化的前端开发 3.github超过25k+的stat数,社区完善 4.vuejs更轻量,gzip后大小只有20k+ 5.vuej ...

  3. vc++中 .H 头文件引用的顺序与符号关系

    在使用 #include "math.h"  和 #include <math.h>时,引号 与尖括号的区别如下 此时math.h_1 在工程文件中 math.h_2 ...

  4. CNN结构:场景分割与Relation Network

    参考第一个回答:如何评价DeepMind最新提出的RelationNetWork 参考链接:Relation Network笔记  ,暂时还没有应用到场景中 LiFeifei阿姨的课程:CV与ML课程 ...

  5. java 23种设计模式 链接集锦

    创建型抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html工厂方法 http://www.cnblogs ...

  6. CAD使用DeleteXData删除数据(网页版)

    主要用到函数说明: MxDrawEntity::DeleteXData 删除扩展数据,详细说明如下: 参数 说明 pzsAppName 删除的扩展数据名称,如果为空,删除所有扩展数据 js代码实现如下 ...

  7. vue组件---自定义事件

    首先简单回顾下组件事件及组件的复用 demo1:按钮事件 <div class="button_area"> <button-area></butto ...

  8. JSONP 应用

    受限于浏览器的同源安全策略, js 无法发起跨域的请求. 但是 HTML 中的 <script> 标签却可以引入跨域的文件使用. 而 JSONP 就是利用 <script> 的 ...

  9. Python学习笔记之map、zip和filter函数

    这篇文章主要介绍 Python 中几个常用的内置函数,用好这几个函数可以让自己的代码更加 Pythonnic 哦 1.map map() 将函数 func 作用于序列 seq 的每一个元素,并返回处理 ...

  10. BZOJ 2274 [Usaco2011 Feb]Generic Cow Protests

    [题解] 很容易可以写出朴素DP方程f[i]=sigma f[j] (sum[i]>=sum[j],1<=j<=i).  于是我们用权值树状数组优化即可. #include<c ...