본문 바로가기
카테고리 없음

[oracle] 그룹함수 CUBE - 이해하기 쉽게

by 플랜비BB 2024. 8. 8.
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. ()

// ()의 의미는 전체에 대한 결과를 출력한다는 의미이다.

예제쿼리.txt
0.00MB

 

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