CUBE 함수는 계산 가능한 모든 소계와 합계를 반환한다.
0. CUBE의 원리
패턴만 익히면 어렵지 않다.
SELECT 지역, 제품, SUM(sales)
FROM sales
GROUP BY CUBE(지역, 제품);
1. 지역과 제품별 합계
2. 지역별 합계
3. 제품별 합계
4. 전체 합계
GROUP BY CUBE(A, B);
1. A B
2. A
3. B
4. ()
// ()의 의미는 전체에 대한 결과를 출력한다는 의미이다.
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 CUBE (region);
REGION SUM(SALES)
--------------- ----------
1900 -- 전체 총합계
East 700 -- 지역별 총합계
West 1200
-- 패턴
GROUP BY CUBE(A);
1. A
2. ()
3. 지역과 제품별 매출 합계
SELECT region, product, SUM(sales)
FROM sales
GROUP BY CUBE(region, product);
REGION PRODUCT SUM(SALES)
--------------- --------------- ----------
1900 -- 전체 총합계
Apples 1000 -- 제품별 총합계
Oranges 900
East 700 -- 지역별 총합계
East Apples 300 -- 지역과 제품별 총합계
East Oranges 400
West 1200
West Apples 700
West Oranges 500
-- 패턴
GROUP BY CUBE(A, B);
1. A B
2. A
3. B
4. ()
4. 지역, 제품, 유통업체별 매출 합계
SELECT region, product, retail, SUM(sales)
FROM sales
GROUP BY CUBE(region, product, retail);
REGION PRODUCT RETAIL SUM(SALES)
--------------- --------------- --------------- ----------
1900 -- 전체 총합계
E-Mart 800 -- 유통업체별 총합계
Homeplus 1100
Apples 1000 -- 제품별 총합계
Apples E-Mart 400 -- 제품과 유통업체별 총합계
Apples Homeplus 600
Oranges 900
Oranges E-Mart 400
Oranges Homeplus 500
East 700 -- 지역별 총합계
East E-Mart 350 -- 지역과 유통업체별 총합계
East Homeplus 350
East Apples 300 -- 지역과 제품별 총합계
East Apples E-Mart 100
East Apples Homeplus 200 -- 지역, 제품, 유통업체별 총합계
East Oranges 400
East Oranges E-Mart 250
East Oranges Homeplus 150
West 1200
West E-Mart 450
West Homeplus 750
West Apples 700
West Apples E-Mart 300
West Apples Homeplus 400
West Oranges 500
West Oranges E-Mart 150
West Oranges Homeplus 350
-- 패턴
GROUP BY CUBE(A, B, C);
0. A B C
1. A B
2. A C
3. A
4. B C
5. B
6. C
7. ()
// CUBE 함수의 인자개수가 하나씩 늘때 마다 결과 조합패턴이 2배씩 늘어남
5. GROUPING_ID 예시
-- GROUPING_ID(A, B, C) = 0;
SELECT region, product, retail, SUM(sales)
FROM sales
GROUP BY CUBE(region, product, retail)
HAVING GROUPING_ID(region, product, retail) = 0;
REGION PRODUCT RETAIL SUM(SALES)
--------------- --------------- --------------- ----------
East Oranges E-Mart 250 -- 지역, 제품, 유통업체별 총합계
East Apples Homeplus 200
West Apples E-Mart 300
West Apples Homeplus 400
West Oranges Homeplus 350
East Apples E-Mart 100
East Oranges Homeplus 150
West Oranges E-Mart 150
-- 패턴
GROUP BY CUBE(A, B, C);
0. A B C -- 번호에 맞는 결과값만 출력이 된다.
1. A B
2. A C
3. A
4. B C
5. B
6. C
7. ()
-- GROUPING_ID(A, B, C) = 1;
SELECT region, product, retail, SUM(sales)
FROM sales
GROUP BY CUBE(region, product, retail)
HAVING GROUPING_ID(region, product, retail) = 1;
REGION PRODUCT RETAIL SUM(SALES)
--------------- --------------- --------------- ----------
West Oranges 500 -- 지역과 제품별 총합계
East Apples 300
East Oranges 400
West Apples 700
-- 패턴
GROUP BY CUBE(A, B, C);
0. A B C
1. A B -- 번호에 맞는 결과값만 출력이 된다.
2. A C
3. A
4. B C
5. B
6. C
7. ()
-- GROUPING_ID(A, B, C) = 3;
SELECT region, product, retail, SUM(sales)
FROM sales
GROUP BY CUBE(region, product, retail)
HAVING GROUPING_ID(region, product, retail) = 3;
REGION PRODUCT RETAIL SUM(SALES)
--------------- --------------- --------------- ----------
East 700 -- 지역별 총합계
West 1200
-- 패턴
GROUP BY CUBE(A, B, C);
0. A B C
1. A B
2. A C
3. A -- 번호에 맞는 결과값만 출력이 된다.
4. B C
5. B
6. C
7. ()
-- GROUPING_ID(A, B, C) = 7;
SELECT region, product, retail, SUM(sales)
FROM sales
GROUP BY CUBE(region, product, retail)
HAVING GROUPING_ID(region, product, retail) = 7;
REGION PRODUCT RETAIL SUM(SALES)
--------------- --------------- --------------- ----------
1900 -- 전체 총합계
-- 패턴
GROUP BY CUBE(A, B, C);
0. A B C
1. A B
2. A C
3. A
4. B C
5. B
6. C
7. () -- 번호에 맞는 결과값만 출력이 된다.
[oracle] 그룹함수 ROLLUP - 이해하기 쉽게
[oracle] 그룹함수 GROUPING SETS - 이해하기 쉽게
[oracle] 그룹함수 비교 ROLLUP / CUBE / GROUPING SETS