ROLLUP**은 Oracle SQL에서 다차원 집계를 계산할 때 사용하는 확장된 GROUP BY 기능입니다.
특히, 집계 레벨별로 소계(Subtotal), 총계(Grand Total) 를 자동으로 계산해줄 때 사용합니다.
ROLLUP은 일반적으로 다차원 분석(OLAP)이나 보고서 생성시 유용합니다.
기본 문법
SELECT 컬럼1, 컬럼2, 집계함수(컬럼3)
FROM 테이블
GROUP BY ROLLUP (컬럼1, 컬럼2);
- ROLLUP(컬럼1, 컬럼2)은 다음과 같이 그룹핑합니다:
- (컬럼1, 컬럼2) 별 집계
- 컬럼1 별 소계 (컬럼2는 NULL)
- 전체 총계 (컬럼1, 컬럼2 모두 NULL)
예제
테이블: SALES
| REGION | PRODUCT | SALES |
| East | A | 100 |
| East | B | 150 |
| West | A | 200 |
| West | B | 250 |
쿼리
SELECT REGION, PRODUCT, SUM(SALES)
FROM SALES
GROUP BY ROLLUP (REGION, PRODUCT);
결과
| REGION | PRODUCT | SUM(SALES) |
| East | A | 100 |
| East | B | 150 |
| East | NULL | 250 |
| West | A | 200 |
| West | B | 250 |
| West | NULL | 450 |
| NULL | NULL | 700 |
추가 기능: GROUPING 함수
- ROLLUP을 쓰면 NULL이 소계/총계로 나오기 때문에, GROUPING() 함수를 사용해서 진짜 데이터 NULL과 구분할 수 있습니다.
SELECT
REGION,
PRODUCT,
SUM(SALES),
GROUPING(REGION) AS REGION_GRP,
GROUPING(PRODUCT) AS PRODUCT_GRP
FROM SALES
GROUP BY ROLLUP(REGION, PRODUCT);
| East | A | 100 | 0 | 0 |
| East | B | 150 | 0 | 0 |
| East | NULL | 250 | 0 | 1 |
| ... | ... | ... | ... | ... |
| NULL | NULL | 700 | 1 | 1 |
- GROUPING(컬럼) = 1이면 소계/총계라는 의미입니다.
🚀 고급 사용법
1. GROUPING SETS와 함께 사용
- ROLLUP은 일종의 특정한 GROUPING SETS입니다.
- 직접 GROUPING SETS를 명시하면 더 다양한 패턴으로 그룹핑이 가능합니다.
SELECT REGION, PRODUCT, SUM(SALES)
FROM SALES
GROUP BY GROUPING SETS (
(REGION, PRODUCT), -- 일반 데이터
(REGION), -- 지역별 소계
() -- 전체 총계
);
※ ROLLUP(REGION, PRODUCT)와 결과가 같습니다.
2. CASE WHEN GROUPING() 조합
- 결과 출력시 소계/총계를 사람이 보기 좋게 표시할 수 있습니다.
SELECT
CASE WHEN GROUPING(REGION) = 1 THEN '전체 지역'
ELSE REGION
END AS REGION,
CASE WHEN GROUPING(PRODUCT) = 1 THEN '전체 제품'
ELSE PRODUCT
END AS PRODUCT,
SUM(SALES) AS TOTAL_SALES
FROM SALES
GROUP BY ROLLUP (REGION, PRODUCT);
출력 예시
| REGION | PRODUCT | TOTAL_SALES |
| East | A | 100 |
| East | B | 150 |
| East | 전체 제품 | 250 |
| West | A | 200 |
| West | B | 250 |
| West | 전체 제품 | 450 |
| 전체 지역 | 전체 제품 | 700 |
3. ORDER BY 함께 사용
- ROLLUP 결과는 자동으로 정렬되지 않습니다.
- 필요시 ORDER BY를 직접 설정해주어야 결과가 보기 좋습니다.
ORDER BY
REGION NULLS LAST,
PRODUCT NULLS LAST;
- NULLS LAST를 주면 소계/총계가 마지막에 깔끔하게 정렬됩니다.
4. 다중 ROLLUP (Nested ROLLUP)
- Oracle 11g부터 다중 ROLLUP도 지원합니다. (단, 복잡성 주의!)
SELECT CATEGORY, REGION, PRODUCT, SUM(SALES)
FROM SALES
GROUP BY ROLLUP (CATEGORY, (REGION, PRODUCT));
- 이 구조는 CATEGORY 소계 ➔ (REGION, PRODUCT)로 복합 소계를 생성합니다.
📌 정리
| 구분 | 요약 |
| 주의사항 | NULL 구분, 컬럼 순서, 퍼포먼스, HAVING 절 주의 |
| 고급기법 | GROUPING CASE, GROUPING SETS, ORDER BY 정렬, 다중 ROLLUP |
📖 기본 개념 정리
| 구분 | ROLLUP | CUBE |
| 목적 | 계층적 소계 및 총계 | 모든 조합(다차원) 소계 및 총계 |
| 집계 패턴 | 단계별(Top-Down) | 모든 가능한 조합 |
| 결과 양 | 상대적으로 적음 | 훨씬 많음 |
| 사용 용도 | 주로 보고서, 계층 데이터 요약 | 다차원 분석 (OLAP), 피벗 테이블 생성 |
🔎 구조적 차이
🔹 ROLLUP
- 왼쪽 ➔ 오른쪽 순서대로 그룹핑하며 중간마다 소계/총계를 계산합니다.
- 계층구조: 1단계 ➔ 2단계 ➔ 전체 단계
- 조합이 적음, 최상위 총계까지 자연스럽게 올라갑니다.
SELECT REGION, PRODUCT, SUM(SALES)
FROM SALES
GROUP BY ROLLUP(REGION, PRODUCT);
결과는:
(REGION, PRODUCT)별
REGION별 (PRODUCT 무시)
전체 총계 (REGION, PRODUCT 모두 무시)
🔹 CUBE
- 모든 조합을 구합니다.
- 가능한 모든 차원 조합에 대해 소계가 생성됩니다.
- (REGION), (PRODUCT), (REGION, PRODUCT), () 모두 계산
SELECT REGION, PRODUCT, SUM(SALES)
FROM SALES
GROUP BY CUBE(REGION, PRODUCT);
결과는:
(REGION, PRODUCT)
(REGION)
(PRODUCT)
(전체)
📊 결과 예시 비교
SALES 테이블 데이터
| REGION | PRODUCT | SALES |
| East | A | 100 |
| East | B | 150 |
| West | A | 200 |
| West | B | 250 |
ROLLUP 결과
| REGION | PRODUCT | SUM(SALES) | 설명 |
| East | A | 100 | 상세 |
| East | B | 150 | 상세 |
| East | NULL | 250 | East 소계 |
| West | A | 200 | 상세 |
| West | B | 250 | 상세 |
| West | NULL | 450 | West 소계 |
| NULL | NULL | 700 | 전체 총계 |
CUBE 결과
| REGION | PRODUCT | SUM(SALES) | 설명 |
| East | A | 100 | 상세 |
| East | B | 150 | 상세 |
| East | NULL | 250 | East 소계 |
| West | A | 200 | 상세 |
| West | B | 250 | 상세 |
| West | NULL | 450 | West 소계 |
| NULL | A | 300 | A 제품 소계 |
| NULL | B | 400 | B 제품 소계 |
| NULL | NULL | 700 | 전체 총계 |
🧩 CUBE는 제품별 소계 (A, B 각각 합계)까지 추가로 나오는 게 특징입니다!
🛠️ 사용 시 주의사항
| 항목 | ROLLUP | CUBE |
| 데이터 양 | 적당 | 많음 (빠르게 폭발) |
| 퍼포먼스 | 상대적으로 빠름 | 느릴 수 있음 (조합 수 증가) |
| NULL 처리 | 소계에서만 NULL | 모든 차원 소계에 NULL |
| 실무 활용 | 보고서 (예: 지역-상품 매출) | 다차원 분석 (예: OLAP Cube) |
🧠 요약 포인트
- 단계적 요약이면 ➔ ROLLUP
(ex: 지역별 ➔ 전체 매출) - 다차원 분석 필요하면 ➔ CUBE
(ex: 지역별/제품별/전체 매출 모두) - 데이터가 많고 빠른 응답 원하면 ➔ ROLLUP 선호
- OLAP 환경, 복합 피벗 테이블 필요하면 ➔ CUBE 필수
'Database' 카테고리의 다른 글
| myql 메모 (0) | 2025.06.18 |
|---|---|
| MySQL:ALTER TALBE ADD COLUMN이 오래 걸리는 경우 (0) | 2025.05.19 |
| 쿼리 숫자형 텍스트 정렬 (0) | 2023.11.22 |
| JDBC-8038:Expression is not in a GROUP BY clause. (0) | 2023.11.02 |
| Tibero function (0) | 2023.07.03 |