반응형
SQL의 GROUP BY는 집계할 때 필수죠?
그런데 복잡한 다중 그룹을 요약하려면?
→ ROLLUP, CUBE, GROUPING SETS가 등장합니다! 🎉
🧪 실습용 테이블 만들기
CREATE TABLE sales (
region VARCHAR(20), -- 지역
product VARCHAR(20), -- 제품
sales_amt INT -- 매출액
);
INSERT INTO sales VALUES
('서울', '노트북', 1000),
('서울', '폰', 800),
('부산', '노트북', 1200),
('부산', '폰', 700),
('대전', '폰', 600);
1️⃣ 기본 GROUP BY
SELECT region, product, SUM(sales_amt) AS total_sales
FROM sales
GROUP BY region, product;
🧠 설명: 지역 + 제품별로 매출을 합산합니다.
✔️ 결과는 각 조합별 매출 합계만 나옴.

2️⃣ ROLLUP : 단계적 합계 구하기
SELECT region, product, SUM(sales_amt) AS total_sales
FROM sales
GROUP BY ROLLUP(region, product);
🧠 설명:
ROLLUP(A, B)은 다음 조합을 자동 계산해줍니다:
- (A, B) ← 그룹별
- (A, NULL) ← A 단위 소계
- (NULL, NULL) ← 전체 합계
✔️ 이걸로 “소계”와 “총합” 자동 계산 가능!

3️⃣ CUBE : 모든 조합 계산
SELECT region, product, SUM(sales_amt) AS total_sales
FROM sales
GROUP BY CUBE(region, product);
🧠 설명:
CUBE(A, B)는 가능한 모든 조합을 만들어줍니다:
- (A, B)
- (A, NULL)
- (NULL, B)
- (NULL, NULL)
즉, 행과 열의 소계까지 모두 구해줌!

4️⃣ GROUPING SETS : 내가 원하는 그룹만
SELECT region, product, SUM(sales_amt) AS total_sales
FROM sales
GROUP BY GROUPING SETS (
(region, product),
(region),
(product),
()
);
🧠 설명:
GROUPING SETS는 직접 원하는 집계 조합만 지정할 수 있어요
위 예시는:
- (region, product) : 기본 조합
- (region) : 지역별 소계
- (product) : 제품별 소계
- () : 전체합계
✔️ 불필요한 조합은 생략하고!
✔️ 정확히 내가 원하는 집계만 나옴!
5️⃣ GROUPING()함수: NULL은 진짜 NULL일까?
집계 결과에서 NULL은 “소계”를 의미할 때도 있지만,
진짜 NULL일 수도 있죠? 🤔 그래서 도와주는 함수가 GROUPING()!
SELECT
region,
product,
GROUPING(region) AS grp_region,
GROUPING(product) AS grp_product,
SUM(sales_amt) AS total_sales
FROM sales
GROUP BY ROLLUP(region, product);

- GROUPING = 1 → 이건 집계용 NULL (즉 소계나 총계)
- GROUPING = 0 → 이건 진짜 값
5️⃣ GROUPING() 함수 + CASE문으로 소계/총계 라벨 붙이기
아래 쿼리는 ROLLUP 결과에 "소계", "총계" 라는 이름을 직관적으로 붙여주는 방법이에요!
SELECT
CASE
WHEN GROUPING(region) = 1 AND GROUPING(product) = 1 THEN '총계'
WHEN GROUPING(region) = 0 AND GROUPING(product) = 1 THEN region || ' 소계'
ELSE region
END AS region_label,
product,
SUM(sales_amt) AS total_sales
FROM sales
GROUP BY ROLLUP(region, product);

조건 | 의미 | 출력값 |
GROUPING(region)=1 AND GROUPING(product)=1 | 둘 다 소계 → 전체 총계 | '총계' |
GROUPING(product)=1 | product만 소계 → 지역 소계 | '서울 소계', '부산 소계' 등 |
그 외 | 일반 행 | 그대로 지역명 |
🧾 요약 정리표
문법 | 설명 | 활용 예 |
ROLLUP(A, B) | A, A+B, 전체 합계를 단계적으로 계산 | 보고서 소계/총계 |
CUBE(A, B) | A, B, A+B, 전체 조합을 모두 계산 | 피벗 요약 |
GROUPING SETS | 원하는 그룹 조합만 선택적으로 지정 가능 | 맞춤형 집계 |
GROUPING(col) | 집계 NULL인지 실제 NULL인지 구분 | UI 표시 분기처리 |
반응형
'자격증 > SQLD' 카테고리의 다른 글
SQL 정규화 완전정복 (0) | 2025.05.17 |
---|---|
윈도우 함수 완전정복 : 순위 / 집계 / 행순서 / 비율 함수 (0) | 2025.05.12 |
SQL 집합 연산자 완벽 가이드: UNION / UNION ALL / INTERSECT / MINUS(EXCEPT) (0) | 2025.05.12 |
SQL 서브쿼리 완전 정복: 스칼라 / 인라인 뷰 / 중첩 서브쿼리 (0) | 2025.05.12 |
조인(JOIN) (0) | 2025.05.06 |