Oracle 简单的列转行

hemenhao 2014-11-21

Oracle 简单的列转行

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

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

 

相关推荐