개념 요약
| 구분 | 설명 | 결과 집합 특징 |
| GROUPING SETS | 여러 GROUP BY 집합을 한 쿼리에서 동시에 수행 | 결과가 UNION ALL과 유사 (각 grouping 별 결과 따로) |
| ROLLUP | 계층적(위계적) 합계 생성 (→ 부분합 + 총합) | n개의 컬럼이면 n+1 단계의 집계 |
| CUBE | 가능한 모든 컬럼 조합의 합계 생성 (→ 다차원 집계) | n개의 컬럼이면 2^n 조합 결과 |
예시 SQL & 결과
CREATE TABLE Sales (
region VARCHAR(10),
product VARCHAR(10),
amount NUMBER
);
INSERT INTO Sales VALUES ('서울', 'A', 100);
INSERT INTO Sales VALUES ('서울', 'B', 200);
INSERT INTO Sales VALUES ('부산', 'A', 150);
INSERT INTO Sales VALUES ('부산', 'B', 300);
1) GROUPING SETS
SELECT region, product, SUM(amount)
FROM Sales
GROUP BY GROUPING SETS ((region), (product));
| region | product | SUM(amount) |
| 서울 | NULL | 300 |
| 부산 | NULL | 450 |
| NULL | A | 250 |
| NULL | B | 500 |
→ region별 합계 + product별 합계를 한 번에 출력. (UNION ALL 느낌)
2) ROLLUP
SELECT region, product, SUM(amount)
FROM Sales
GROUP BY ROLLUP(region, product);
| region | product | SUM(amount) |
| 서울 | A | 100 |
| 서울 | B | 200 |
| 서울 | NULL | 300 |
| 부산 | A | 150 |
| 부산 | B | 300 |
| 부산 | NULL | 450 |
| NULL | NULL | 750 |
→ 계층적: region+product → region → 전체
ROLLUP 칼럼 순서를 바꾸면?
SELECT region, product, SUM(amount)
FROM Sales
GROUP BY ROLLUP(product, region);
| region | product | SUM(amount) |
| 서울 | A | 100 |
| 부산 | A | 150 |
| NULL | A | 250 |
| 서울 | B | 200 |
| 부산 | B | 300 |
| NULL | B | 500 |
| NULL | NULL | 750 |
→ ROLLUP은 순서에 따라 어떤 집계가 중간에 나오느냐가 달라진다
3) CUBE
SELECT region, product, SUM(amount)
FROM Sales
GROUP BY CUBE(region, product);
| region | product | SUM(amount) |
| 서울 | A | 100 |
| 서울 | B | 200 |
| 서울 | NULL | 300 |
| 부산 | A | 150 |
| 부산 | B | 300 |
| 부산 | NULL | 450 |
| NULL | A | 250 |
| NULL | B | 500 |
| NULL | NULL | 750 |
→ 모든 조합 (부분합 + 총합). 다차원 OLAP 느낌.
4) GROUPING 함수
해당 칼럼이 집계로 인해 NULL인지 여부 확인 (0/1 반환)
SELECT region
, product
, SUM(amount) AS total
, GROUPING(region) AS g_region
, GROUPING(product) AS g_product
FROM Sales
GROUP BY ROLLUP(region, product);
| region | product | total | g_region | g_product |
| 서울 | A | 100 | 0 | 0 |
| 서울 | B | 200 | 0 | 0 |
| 서울 | NULL | 300 | 0 | 1 |
| 부산 | A | 150 | 0 | 0 |
| 부산 | B | 300 | 0 | 0 |
| 부산 | NULL | 450 | 0 | 1 |
| NULL | NULL | 750 | 1 | 1 |
이런 성질을 이용해 아래와 같이 NULL 핸들링 가능.
CASE
WHEN GROUPING(region) = 1 THEN '전체지역'
ELSE region
END
정리
- ROLLUP(...) → 계층적 요약 (n+1 단계)
- CUBE(...) → 모든 조합 요약 (2^n 결과)
- GROUPING SETS(...) → 특정 그룹핑 집합만 선택 가능 (UNION ALL 효과)
- 그룹핑 쿼리에서 NULL 의미: 상위 집계 레벨을 나타냄 (주의! 실제 NULL 아님)
'SQL Professional' 카테고리의 다른 글
| [독학! SQLP] 트랜잭션 (1) | 2025.08.20 |
|---|---|
| [독학! SQLP] SQL 조인! (6) | 2025.08.20 |
| [독학! SQLP] 함수 정리! (0) | 2025.08.20 |
| [독학! SQLP] NULL에 관하여! (0) | 2025.08.19 |
| [독학! SQLP] DCL? DDL? DML? TCL? (0) | 2025.08.19 |