-下記、ROLLUPの例にて部署別JOBに該当する給与と社員数を出力した。
SQL> SELECT b.dname, a.job, SUM(a.sal) sal,
2 COUNT(a.empno) emp_count
3 FROM emp a, dept b
4 WHERE a.deptno = b.deptno
5 GROUP BY ROLLUP(b.dname, a.job);
DNAME JOB SAL EMP_COUNT
-------------- --------- ---------- ----------
SALES CLERK 950 1
SALES MANAGER 2850 1
SALES SALESMAN 4350 3
SALES 8150 5 ---> SALES部署の給与合計と社員数
RESEARCH CLERK 1900 2
RESEARCH ANALYST 6000 2
RESEARCH MANAGER 2975 1
RESEARCH 10875 5 ---> REASERCH部署の給与合計と社員数
ACCOUNTING CLERK 1300 1
ACCOUNTING MANAGER 2450 1
ACCOUNTING PRESIDENT 5000 1
ACCOUNTING 8750 3 ---> ACCOUNTING部署の給与合計と社員数
27775 13 ---> 全体給与合計と社員数
しかし、部署別で各JOBの給与と社員数また、各JOB別の給与合計と社員数を見るためには
2つのROLLUPを使用する必要がある。
SQL> SELECT b.dname, a.job, SUM(a.sal) sal, COUNT(a.empno) emp_count
2 FROM emp a, dept b
3 WHERE a.deptno = b.deptno
4 GROUP BY ROLLUP(b.dname, a.job)
5 UNION
6 SELECT ' ', job, SUM(sal) sal, COUNT(empno) emp_count
7 FROM emp
8 GROUP BY ROLLUP(job);
DNAME JOB SAL EMP_COUNT
-------------- --------- ---------- ----------
ANALYST 6000 2 --->2回目のROLLUP結果
CLERK 4150 4
MANAGER 8275 3
PRESIDENT 5000 1
SALESMAN 4350 3
27775 13
ACCOUNTING CLERK 1300 1 --->ここから1回目のROLLUP結果
ACCOUNTING MANAGER 2450 1
ACCOUNTING PRESIDENT 5000 1
ACCOUNTING 8750 3
RESEARCH ANALYST 6000 2
RESEARCH CLERK 1900 2
RESEARCH MANAGER 2975 1
RESEARCH 10875 5
SALES CLERK 950 1
SALES MANAGER 2850 1
SALES SALESMAN 4350 3
SALES 8150 5
27775 13
CUBEを使用して簡単なSQL文で上記結果が得られる
SQL> SELECT b.dname, a.job, SUM(a.sal) sal, COUNT(a.empno) emp_coun
2 FROM emp a, dept b
3 WHERE a.deptno = b.deptno
4 GROUP BY CUBE(b.dname, a.job);
DNAME JOB SAL EMP_COUNT
-------------- --------- ---------- ----------
27775 13 --->JOB別の給与総計と社員数
CLERK 4150 4
ANALYST 6000 2
MANAGER 8275 3
SALESMAN 4350 3
PRESIDENT 5000 1
SALES 8150 5
SALES CLERK 950 1
SALES MANAGER 2850 1
SALES SALESMAN 4350 3
RESEARCH 10875 5
RESEARCH CLERK 1900 2
RESEARCH ANALYST 6000 2
RESEARCH MANAGER 2975 1
ACCOUNTING 8750 3
ACCOUNTING CLERK 1300 1
ACCOUNTING MANAGER 2450 1
ACCOUNTING PRESIDENT 5000 1
--CUBEはCross-Tabに対するSummaryを出力する
--ROLLUP結果のItem Total値とColumn Total値を出力できる
■GROUPING()関数
-GROUPING関数はROLLUP、CUBE両方で使用できる
-GROUPING関数は該当ROWがGROUP BYにより算出されたROWの場合0を返し、
ROLLUPかCUBEにより算出されたROWの場合は1を返す。
※該当ROWが結果集合により算出されたデータなのか、ROLLUPやCUBEにより算出された
データかを見分けるための関数!
SQL> SELECT b.dname, a.job, SUM(a.sal), COUNt(a.empno) emp_count,
2 GROUPING(b.dname) "D", GROUPING(a.job) "S"
3 FROM emp a, dept b
4 WHERE a.deptno = b.deptno
5 GROUP BY CUBE(b.dname, a.job);
DNAME JOB SUM(A.SAL) EMP_COUNT D S
-------------- --------- ---------- ---------- ---------- ----------
27775 13 1 1
CLERK 4150 4 1 0
ANALYST 6000 2 1 0
MANAGER 8275 3 1 0
SALESMAN 4350 3 1 0
PRESIDENT 5000 1 1 0
SALES 8150 5 0 1
SALES CLERK 950 1 0 0
SALES MANAGER 2850 1 0 0
SALES SALESMAN 4350 3 0 0
RESEARCH 10875 5 0 1
RESEARCH CLERK 1900 2 0 0
RESEARCH ANALYST 6000 2 0 0
RESEARCH MANAGER 2975 1 0 0
ACCOUNTING 8750 3 0 1
ACCOUNTING CLERK 1300 1 0 0
ACCOUNTING MANAGER 2450 1 0 0
ACCOUNTING PRESIDENT 5000 1 0 0
0 件のコメント:
コメントを投稿