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語(yǔ)法
?
?
?
?
?
?
?
?
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));
?
不過這個(gè)地方null值沒有替換成0,要通過nvl再轉(zhuǎn)換一下。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
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
?
小結(jié):
decode 語(yǔ)法簡(jiǎn)單,Oracle獨(dú)有。 case sql標(biāo)準(zhǔn)語(yǔ)法。 pivot 語(yǔ)法最為簡(jiǎn)單,Oracle、sqlserver、postgresql均可以使用。
?
下面再來(lái)講講wm_concat、listagg、xmlagg。
?
需求:部門編號(hào)為20的所有的員工信息,以行的形式顯示。
?
四、wm_contact語(yǔ)法
?
?
?
?
SELECT T.DEPTNO, wm_concat(t.ename) names FROM EMP T WHERE T.DEPTNO = '20' GROUP BY T.DEPTNO;
?
?
五、listagg語(yǔ)法
?
?
?
?
?
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語(yǔ)法
?
?
?
?
?
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;