ROLLUP은 SQL에서 그룹화된 데이터에 대해 여러 수준의 집계를 생성하는 기능이다. 이는 데이터 분석과 보고서 작성에서 유용하며, 한 번의 쿼리로 다양한 집계 수준의 결과를 얻을 수 있도록 도와준다.
0. ROLLUP의 원리
패턴만 익히면 어렵지 않다.
SELECT 지역, 제품, SUM(sales)
FROM sales
GROUP BY ROLLUP(지역, 제품);
1. 지역과 제품별 합계
2. 지역별 합계
3. 전체 합계
GROUP BY ROLLUP(A, B);
1. A B
2. A
3. ()
// ()의 의미는 전체에 대한 결과를 출력한다는 의미이다.
1. 예제 테이블
ID REGION PRODUCT RETAIL SALES
---------- --------------- --------------- --------------- ----------
1 East Apples E-Mart 100
2 East Apples Homeplus 200
3 East Oranges E-Mart 250
4 East Oranges Homeplus 150
5 West Apples E-Mart 300
6 West Apples Homeplus 400
7 West Oranges E-Mart 150
8 West Oranges Homeplus 350
2. 지역별 매출 합계
SELECT region, SUM(sales)
FROM sales
GROUP BY ROLLUP (region);
REGION SUM(SALES)
--------------- ----------
East 700 -- 지역별 총합계
West 1200
1900 -- 전체 총합계
-- 패턴
GROUP BY ROLLUP(A);
1. A
2. ()
3. 지역과 제품별 매출 합계
SELECT region, product, SUM(sales)
FROM sales
GROUP BY ROLLUP(region, product);
REGION PRODUCT SUM(SALES)
--------------- --------------- ----------
East Apples 300 -- 지역과 제품별 총합계
East Oranges 400
East 700 -- 지역별 총합계
West Apples 700
West Oranges 500
West 1200
1900 -- 전체 총합계
-- 패턴
GROUP BY ROLLUP(A, B);
1. A B
2. A
3. ()
4. 지역, 제품, 유통업체별 매출 합계
SELECT region, product, retail, SUM(sales)
FROM sales
GROUP BY ROLLUP(region, product, retail);
REGION PRODUCT RETAIL SUM(SALES)
--------------- --------------- --------------- ----------
East Apples E-Mart 100 -- 지역, 제품, 유통업체별 총합계
East Apples Homeplus 200
East Apples 300 -- 지역과 제품별 총합계
East Oranges E-Mart 250
East Oranges Homeplus 150
East Oranges 400
East 700 -- 지역별 총합계
West Apples E-Mart 300
West Apples Homeplus 400
West Apples 700
West Oranges E-Mart 150
West Oranges Homeplus 350
West Oranges 500
West 1200
1900 -- 전체 총합계
-- 패턴
GROUP BY ROLLUP(A, B, C);
1. A B C
2. A B
3. A
4. ()
5. 응용 패턴
GROUP BY ROLLUP(A, B, C);
1. A B C
2. A B
3. A
4. ()
GROUP BY ROLLUP(A, (B, C));
1. A (B C)
2. A
3. ()
GROUP BY A ROLLUP((B, C));
1. A (B C)
2. A
// 괄호로 묶여져 있는 컬럼은 하나로 본다.
6. 응용 패턴 예시
-- GROUP BY ROLLUP(A, (B, C));
SELECT region, product, retail, SUM(sales)
FROM sales
GROUP BY ROLLUP(region, (product, retail));
REGION PRODUCT RETAIL SUM(SALES)
--------------- --------------- --------------- ----------
East Apples E-Mart 100 -- 지역, 제품, 유통업체별 총합계
East Apples Homeplus 200
East Oranges E-Mart 250
East Oranges Homeplus 150
East 700 -- 지역별 총합계
West Apples E-Mart 300
West Apples Homeplus 400
West Oranges E-Mart 150
West Oranges Homeplus 350
West 1200
1900 -- 전체 총합계
-- 패턴
GROUP BY ROLLUP(A, (B, C));
1. A B C
2. A B -- 이 부분이 빠짐(지역과 제품별 총합계)
3. A
4. ()
-- B와 C를 한 묶음 X로 생각하면 아래와 같은 패턴이다.
GROUP BY ROLLUP(A, X);
1. A X
2. A
3. ()
-- GROUP BY A ROLLUP((B, C));
SELECT region, product, retail, SUM(sales)
FROM sales
GROUP BY region, ROLLUP((product, retail));
REGION PRODUCT RETAIL SUM(SALES)
--------------- --------------- --------------- ----------
East Apples E-Mart 100 -- 지역, 제품, 유통업체별 총합계
East Apples Homeplus 200
East Oranges E-Mart 250
East Oranges Homeplus 150
East 700 -- 지역별 총합계
West Apples E-Mart 300
West Apples Homeplus 400
West Oranges E-Mart 150
West Oranges Homeplus 350
West 1200
-- 그룹바이절 A는 롤업의 결과와 합쳐준다고 생각하면 편하다.
GROUP BY ROLLUP((B, C));
1. B C
2. ()
GROUP BY A ROLLUP((B, C));
1. A + B C = A B C
2. A + () = A
[oracle] 그룹함수 CUBE - 이해하기 쉽게
[oracle] 그룹함수 GROUPING SETS - 이해하기 쉽게
[oracle] 그룹함수 ROLLUP / CUBE / GROUPING SETS