GROUP FUNCTIONS : ROLLUP, CUBE, GROUPING SETS
STEP 1. 일반적인 GROUP BY 절 사용
SELECT DNAME, JOB, COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, JOB;
| DNAME |
JOB |
TOTAL Empl |
Total Sal |
| SALES |
MANAGER |
1 |
2850 |
| SALES |
CLERK |
1 |
950 |
| ACCOUNTING |
MANAGER |
1 |
2450 |
| RESEARCH |
ANALYST |
2 |
6000 |
| ACCOUNTING |
CLERK |
1 |
1300 |
| SALES |
SALESMAN |
4 |
5600 |
| RESEARCH |
MANAGER |
1 |
2975 |
| ACCOUNTING |
PRESIDENT |
1 |
5000 |
| RESEARCH |
CLERK |
2 |
1900 |
STEP 1-2. GROUP BY 절 + ORDER BY 절 사용
SELECT DNAME, JOB, COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, JOB
ORDER BY DNAME, JOB;
| DNAME |
JOB |
TOTAL Empl |
Total Sal |
| ACCOUNTING |
CLERK |
1 |
1300 |
| ACCOUNTING |
MANAGER |
1 |
2450 |
| ACCOUNTING |
PRESIDENT |
1 |
5000 |
| RESEARCH |
ANALYST |
2 |
6000 |
| RESEARCH |
CLERK |
2 |
1900 |
| RESEARCH |
MANAGER |
1 |
2975 |
| SALES |
CLERK |
1 |
950 |
| SALES |
MANAGER |
1 |
2850 |
| SALES |
SALESMAN |
4 |
5600 |
STEP 2. ROLLUP 함수 사용
SELECT DNAME, JOB, COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP(DNAME, JOB);
| DNAME |
JOB |
TOTAL Empl |
Total Sal |
| SALES |
CLERK |
1 |
950 |
| SALES |
MANAGER |
1 |
2850 |
| SALES |
SALESMAN |
4 |
5600 |
| SALES |
|
6 |
9400 |
| RESEARCH |
ANALYST |
2 |
6000 |
| RESEARCH |
CLERK |
2 |
1900 |
| RESEARCH |
MANAGER |
1 |
2975 |
| RESEARCH |
|
5 |
10875 |
| ACCOUNTING |
CLERK |
1 |
1300 |
| ACCOUNTING |
MANAGER |
1 |
2450 |
| ACCOUNTING |
PRESIDENT |
1 |
5000 |
| ACCOUNTING |
|
3 |
8750 |
|
|
14 |
29025 |
STEP 2-2. ROLLUP 함수 + ORDER BY 절 사용
SELECT DNAME, JOB, COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP(DNAME, JOB)
ORDER BY DNAME, JOB;
| DNAME |
JOB |
TOTAL Empl |
Total Sal |
| ACCOUNTING |
CLERK |
1 |
1300 |
| ACCOUNTING |
MANAGER |
1 |
2450 |
| ACCOUNTING |
PRESIDENT |
1 |
5000 |
| ACCOUNTING |
|
3 |
8750 |
| RESEARCH |
ANALYST |
2 |
6000 |
| RESEARCH |
CLERK |
2 |
1900 |
| RESEARCH |
MANAGER |
1 |
2975 |
| RESEARCH |
|
5 |
10875 |
| SALES |
CLERK |
1 |
950 |
| SALES |
MANAGER |
1 |
2850 |
| SALES |
SALESMAN |
4 |
5600 |
| SALES |
|
6 |
9400 |
|
|
14 |
29025 |
STEP 3. GROUPING 함수 사용
SELECT DNAME, GROUPING(DNAME), JOB, GROUPING(JOB),
COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP(DNAME, JOB);
| DNAME |
GROUPING(DNAME) |
JOB |
GROUPING(JOB) |
TOTAL Empl |
Total Sal |
| SALES |
0 |
CLERK |
0 |
1 |
950 |
| SALES |
0 |
MANAGER |
0 |
1 |
2850 |
| SALES |
0 |
SALESMAN |
0 |
4 |
5600 |
| SALES |
0 |
|
1 |
6 |
9400 |
| RESEARCH |
0 |
ANALYST |
0 |
2 |
6000 |
| RESEARCH |
0 |
CLERK |
0 |
2 |
1900 |
| RESEARCH |
0 |
MANAGER |
0 |
1 |
2975 |
| RESEARCH |
0 |
|
1 |
5 |
10875 |
| ACCOUNTING |
0 |
CLERK |
0 |
1 |
1300 |
| ACCOUNTING |
0 |
MANAGER |
0 |
1 |
2450 |
| ACCOUNTING |
0 |
PRESIDENT |
0 |
1 |
5000 |
| ACCOUNTING |
0 |
|
1 |
3 |
8750 |
|
1 |
|
1 |
14 |
29025 |
STEP 4. GROUPING 함수 + CASE 사용
SELECT CASE GROUPING(DNAME)
WHEN 1 THEN 'All Depertments'
ELSE DNAME
END AS DNAME, -- DECODE(GROUPING(DNAME), 1, 'All Depertments') AS DNAME
CASE GROUPING(JOB)
WHEN 1 THEN 'All Jobs'
ELSE JOB
END AS JOB,
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP(DNAME, JOB);
| DNAME |
JOB |
TOTAL Empl |
Total Sal |
| SALES |
CLERK |
1 |
950 |
| SALES |
MANAGER |
1 |
2850 |
| SALES |
SALESMAN |
4 |
5600 |
| SALES |
All Jobs |
6 |
9400 |
| RESEARCH |
ANALYST |
2 |
6000 |
| RESEARCH |
CLERK |
2 |
1900 |
| RESEARCH |
MANAGER |
1 |
2975 |
| RESEARCH |
All Jobs |
5 |
10875 |
| ACCOUNTING |
CLERK |
1 |
1300 |
| ACCOUNTING |
MANAGER |
1 |
2450 |
| ACCOUNTING |
PRESIDENT |
1 |
5000 |
| ACCOUNTING |
All Jobs |
3 |
8750 |
| All Departments |
All Jobs |
14 |
29025 |
STEP 4-2. ROLLUP 함수 일부 사용
SELECT DNAME,
CASE GROUPING(JOB)
WHEN 1 THEN 'All Jobs'
ELSE JOB
END AS JOB,
COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, ROLLUP( JOB);
| DNAME |
JOB |
TOTAL Empl |
Total Sal |
| SALES |
CLERK |
1 |
950 |
| SALES |
MANAGER |
1 |
2850 |
| SALES |
SALESMAN |
4 |
5600 |
| SALES |
All Jobs |
6 |
9400 |
| RESEARCH |
ANALYST |
2 |
6000 |
| RESEARCH |
CLERK |
2 |
1900 |
| RESEARCH |
MANAGER |
1 |
2975 |
| RESEARCH |
All Jobs |
5 |
10875 |
| ACCOUNTING |
CLERK |
1 |
1300 |
| ACCOUNTING |
MANAGER |
1 |
2450 |
| ACCOUNTING |
PRESIDENT |
1 |
5000 |
| ACCOUNTING |
All Jobs |
3 |
8750 |
STEP 4-3. ROLLUP 함수 결합 칼럼 사용
SELECT DNAME, JOB, MGR, SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP(DNAME, (JOB, MGR));
| DNAME |
JOB |
MGR |
Total Sal |
| SALES |
CLERK |
7698 |
950 |
| SALES |
MANAGER |
7839 |
2850 |
| SALES |
SALESMAN |
7698 |
5600 |
| SALES |
|
|
9400 |
| RESEARCH |
CLERK |
7788 |
1100 |
| RESEARCH |
CLERK |
7902 |
800 |
| RESEARCH |
ANALYST |
7566 |
6000 |
| RESEARCH |
MANAGER |
7839 |
2975 |
| RESEARCH |
|
|
10875 |
| ACCOUNTING |
CLERK |
7782 |
1300 |
| ACCOUNTING |
MANAGER |
7839 |
2450 |
| ACCOUNTING |
PRESIDENT |
5000 |
5000 |
| ACCOUNTING |
|
|
8750 |
|
|
|
29025 |
STEP 5. CUBE 함수
SELECT CASE GROUPING(DNAME)
WHEN 1 THEN 'All Depertments'
ELSE DNAME
END AS DNAME, -- DECODE(GROUPING(DNAME), 1, 'All Depertments') AS DNAME
CASE GROUPING(JOB)
WHEN 1 THEN 'All Jobs'
ELSE JOB
END AS JOB,
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY CUBE(DNAME, JOB);
| DNAME |
JOB |
TOTAL Empl |
Total Sal |
| All Departments |
All Jobs |
14 |
29025 |
| All Departments |
CLERK |
|
|
| All Departments |
ANALYST |
|
|
| All Departments |
MANAGER |
|
|
| All Departments |
SALESMAN |
|
|
| All Departments |
PRESIDENT |
|
|
| SALES |
All Jobs |
6 |
9400 |
| SALES |
CLERK |
1 |
950 |
| SALES |
MANAGER |
1 |
2850 |
| SALES |
SALESMAN |
4 |
5600 |
| RESEARCH |
All Jobs |
5 |
10875 |
| RESEARCH |
CLERK |
2 |
1900 |
| RESEARCH |
ANALYST |
2 |
6000 |
| RESEARCH |
MANAGER |
1 |
2975 |
| ACCOUNTING |
All Jobs |
3 |
8750 |
| ACCOUNTING |
CLERK |
1 |
1300 |
| ACCOUNTING |
MANAGER |
1 |
2450 |
| ACCOUNTING |
PRESIDENT |
1 |
5000 |
STEP 5-2. UNION ALL 사용 SQL
SELECT DNAME, JOB, COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, JOB
UNION ALL
SELECT DNAME, 'All Jobs', COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME
UNION ALL
SELECT 'All Departments', JOB, COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY JOB
UNION ALL
SELECT 'All Departments', 'All Jobs', COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO;
STEP 6. GROUPING SETS 함수 : 표시된 인수들에 대한 개별 집계
STEP 6-1. 일반 그룹함수를 이용한 SQL
SELECT DNAME, 'All Jobs', COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME
UNION ALL
SELECT 'All Departments', JOB, COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY JOB
| DNAME |
JOB |
TOTAL Empl |
Total Sal |
| ACCOUNTING |
All Jobs |
3 |
8750 |
| RESEARCH |
All Jobs |
5 |
10875 |
| SALES |
All Jobs |
6 |
9400 |
| All Departments |
CLERK |
4 |
4150 |
| All Departments |
SALESMAN |
4 |
5600 |
| All Departments |
PRESIDENT |
1 |
5000 |
| All Departments |
MANAGER |
3 |
8275 |
| All Departments |
ANALYST |
2 |
6000 |
STEP 6-2. GROUPING SETS 사용 SQL
SELECT DECODE(GROUPING(DNAME), 1, 'All Departments', DNAME) AS DNAME,
DECODE(GROUPING(JOB), 1, 'All Jobs', JOB) AS JOB,
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY GROUPING SETS (DNAME, JOB);
| DNAME |
JOB |
TOTAL Empl |
Total Sal |
| All Departments |
CLERK |
4 |
4150 |
| All Departments |
SALESMAN |
4 |
5600 |
| All Departments |
PRESIDENT |
1 |
5000 |
| All Departments |
MANAGER |
3 |
8275 |
| All Departments |
ANALYST |
2 |
6000 |
| ACCOUNTING |
All Jobs |
3 |
8750 |
| RESEARCH |
All Jobs |
5 |
10875 |
| SALES |
All Jobs |
6 |
9400 |
STEP 6-3. GROUPING SETS 사용 SQL - 순서 변경
SELECT DECODE(GROUPING(DNAME), 1, 'All Departments', DNAME) AS DNAME,
DECODE(GROUPING(JOB), 1, 'All Jobs', JOB) AS JOB,
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY GROUPING SETS (JOB, DNAME);
| DNAME |
JOB |
TOTAL Empl |
Total Sal |
| All Departments |
CLERK |
4 |
4150 |
| All Departments |
SALESMAN |
4 |
5600 |
| All Departments |
PRESIDENT |
1 |
5000 |
| All Departments |
MANAGER |
3 |
8275 |
| All Departments |
ANALYST |
2 |
6000 |
| ACCOUNTING |
All Jobs |
3 |
8750 |
| RESEARCH |
All Jobs |
5 |
10875 |
| SALES |
All Jobs |
6 |
9400 |
STEP 6-4. 3개의 인수를 이용한 GROUPING SETS 이용
SELECT DNAME, JOB, MGR, SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY GROUPING SETS ((DNAME, JOB, MGR), (DNAME, JOB), (JOB, MGR));
| DNAME |
JOB |
TOTAL Empl |
Total Sal |
| SALES |
CLERK |
7698 |
950 |
| ACCOUNTING |
CLERK |
7782 |
1300 |
| RESEARCH |
CLERK |
7788 |
1100 |
| RESEARCH |
CLERK |
7902 |
800 |
| RESEARCH |
ANALYST |
7566 |
6000 |
| SALES |
MANAGER |
7839 |
2850 |
| RESEARCH |
MANAGER |
7839 |
2975 |
| ACCOUNTING |
MANAGER |
7839 |
2450 |
| SALES |
SALESMAN |
7698 |
5600 |
| ACCOUNTING |
PRESIDENT |
|
5000 |
|
CLERK |
7698 |
950 |
|
CLERK |
7782 |
1300 |
|
CLERK |
7788 |
1100 |
|
CLERK |
7902 |
800 |
|
ANALYST |
7566 |
6000 |
|
MANAGER |
7839 |
8275 |
|
SALESMAN |
7698 |
5600 |
|
PRESIDENT |
|
5000 |
| SALES |
MANAGER |
|
2850 |
| SALES |
CLERK |
|
950 |
| ACCOUNTING |
CLERK |
|
1300 |
| ACCOUNTING |
MANAGER |
|
2450 |
| ACCOUNTING |
PRESIDENT |
|
5000 |
| RESEARCH |
MANAGER |
|
2975 |
| SALES |
SALESMAN |
|
5600 |
| RESEARCH |
ANALYST |
|
6000 |
| RESEARCH |
CLERK |
|
1900 |