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

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. 前端er怎样操作剪切复制以及禁止复制+破解等

    前言 有时候我们经常会碰到这些场景:玩掘金.知乎的时候复制一段文字,总是会在内容后面加上一些版权信息,以及像小说网站等都有禁止选中,禁止复制这种功能,还有点击自动复制账号的功能. 我也经常遇到这些场景 ...

  2. ARP劫持处理指令集

    第一组(据传xp有效,未实验) arp -a arp -d arp -s IP地址 MAC地址 第二组(windows2008R2有效,已实验) netsh i i show in (记住其中本地连接 ...

  3. 使用脚本快速线程转储及列出高cpu线程

    jstack `ps -ef | grep java | grep bocai.jar | awk '{print $2}'` > cpu_high.logtop -b -n1 -Hp `ps ...

  4. LPSTR LPCTSTR

    UNICODE:它是用两个字节表示一个字符的方法.比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字节,而在UNI ...

  5. react native 从头开始

    1.react-native run-android 报错SDK location not found. Define location with sdk.dir in the local.prope ...

  6. Luogu P4549 裴蜀定理 / Min

    思路 题目已经给出了正解.我们只需要将裴蜀定理推广到若干数的线性组合就可以做这道题了 要注意的是需要在输入的时候取一个绝对值.因为可能会有负数存在.我之前也写过裴蜀定理的证明,要看的话点这里 吐槽 第 ...

  7. UVA - 514 Rails(栈模拟)

    题目: 给出一个序列,问将1,2,3,4……按从小到大的顺序入栈,能否得到给出的序列. 思路: 用stack模拟就可以了. 当前的cnt如果小于a[i],就将cnt入栈,否则就判断栈顶是不是和a[i] ...

  8. Gym - 101550A(Artwork 倒序+并查集)

    题目: 思路: 1.对输入数据离线,先把所有的黑线都画出来,统计一下剩余的白色连通块的个数,dfs过程将一个连通块放到一个集合中. 2.倒着往前消去黑线,如果当前的块A是白块就看他的四周有没有白块:有 ...

  9. Python学习-if条件语句

    Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 单分支条件语句 if 判断条件: 条件成立,执行该代码块.... 注意:与其他编程语言,如Java和C ...

  10. Effective C++ 一些记录和思考

    Effective C++ Iter 3 - 尽可能使用 const 一个反逻辑的 bitwise const class Text { ... char& operator[](std::s ...