Oracle 简单的列转行

2015-01-21 12:31:15 · 作者: · 浏览: 2

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


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


?