ROLLUP**은 Oracle SQL에서 다차원 집계를 계산할 때 사용하는 확장된 GROUP BY 기능입니다.
특히, 집계 레벨별로 소계(Subtotal), 총계(Grand Total) 를 자동으로 계산해줄 때 사용합니다.

ROLLUP은 일반적으로 다차원 분석(OLAP)이나 보고서 생성시 유용합니다.


기본 문법

SELECT 컬럼1, 컬럼2, 집계함수(컬럼3)
FROM 테이블
GROUP BY ROLLUP (컬럼1, 컬럼2);
  • ROLLUP(컬럼1, 컬럼2)은 다음과 같이 그룹핑합니다:
    1. (컬럼1, 컬럼2) 별 집계
    2. 컬럼1 별 소계 (컬럼2는 NULL)
    3. 전체 총계 (컬럼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

+ Recent posts