SQL에서 집계 분석을 더욱 유연하게 하기 위해 GROUP BY 확장 기능인 ROLLUP, CUBE, GROUPING SETS가 제공됩니다. 이 글에서는 각 기능의 개념, 문법, 예제, 차이점을 정리합니다.
ROLLUP은 그룹별 **계층적 합계(소계, 총계)**를 계산합니다.
SELECT column1, column2, AGG_FUNC(...)
FROM table
GROUP BY ROLLUP(column1, column2);
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB);
| DEPTNO | JOB | SUM(SAL) |
|---|---|---|
| 10 | CLERK | 1300 |
| 10 | MANAGER | 2450 |
| 10 | NULL | 3750 ← 부서 10의 소계 |
| 20 | ANALYST | 6000 |
| 20 | NULL | 6000 |
| NULL | NULL | 9750 ← 전체 총계 |
CUBE는 모든 조합의 그룹별 합계를 계산합니다.
SELECT column1, column2, AGG_FUNC(...)
FROM table
GROUP BY CUBE(column1, column2);
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY CUBE(DEPTNO, JOB);
| DEPTNO | JOB | SUM(SAL) |
|---|---|---|
| 10 | CLERK | 1300 |
| 10 | MANAGER | 2450 |
| 10 | NULL | 3750 |
| NULL | CLERK | 1300 |
| NULL | MANAGER | 2450 |
| NULL | NULL | 9750 |
→ DEPTNO만 그룹, JOB만 그룹, 둘 다 없는 총계까지 포함됨
GROUPING SETS는 여러 개의 GROUP BY 쿼리를 하나로 결합한 것처럼 작동합니다.
SELECT column1, column2, AGG_FUNC(...)
FROM table
GROUP BY GROUPING SETS (
(column1, column2),
(column1),
()
);
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY GROUPING SETS (
(DEPTNO, JOB),
(DEPTNO),
()
);
| DEPTNO | JOB | SUM(SAL) |
|---|---|---|
| 10 | CLERK | 1300 |
| 10 | MANAGER | 2450 |
| 10 | NULL | 3750 |
| NULL | NULL | 9750 |
→ 원하는 그룹핑 조합만 선택적으로 지정 가능
GROUPING(col)
: 해당 컬럼이 집계에서 **NULL로 바뀐 행(소계/총계)**인지 확인
0 → 실제 값1 → NULL (총계/소계)예:
SELECT DEPTNO, JOB,
GROUPING(DEPTNO) AS G1,
GROUPING(JOB) AS G2,
SUM(SAL)
FROM EMP
GROUP BY CUBE(DEPTNO, JOB);
| 기능 | 소계 생성 방식 | 조합 수 | 유연성 | 예시 |
|---|---|---|---|---|
ROLLUP | 좌→우 순서대로 누적 소계 | 적음 | 중간 | (A, B) → (A, B), (A), () |
CUBE | 모든 조합 | 많음 | 낮음 | (A, B) → (A, B), (A), (B), () |
GROUPING SETS | 지정된 조합만 집계 | 유저가 정의함 | 높음 | ((A, B), (A), ()) 등 자유 조합 지정 가능 |
ROLLUP → 계층적 소계와 총계를 원할 때CUBE → 가능한 모든 그룹 조합을 보고 싶을 때GROUPING SETS → 특정한 집계 조합만 지정하고 싶을 때