특정 그룹이 나누어져 있고, 소 그룹의 부분합계를 보고 싶다면 편리하게 사용할 수 있다.

사용 또한 GROUP BY에 추가로 간단하게 사용가능하다.

 

ROLLUP과의 차이는

학년별 학급을 구하는데 CUBE를 사용한다면 전체의 1반, 전체의 2반 합계는 의미가 없다.

하지만 전체의 학급유형(문과, 이과)별 집계는 의미가 있다.

따라서 여기서는 CUBE를 사용하는 것이 좋다.

 

이전 글 참고>

통계함수 ROLLUP() 사용하기

 

 

사용법>

기본의 그룹바이:

GROUP BY 컬럼1, 컬럼2

-->

CUBE 사용할 때:

GROUP BY CUBE (컬럼1, 컬럼2)

 

 

사용예>

학교에서 1학년(1반, 2반)과 2학년(1반, 2반)의 학급유형(문과, 이과)을 학년에서 집계하고,

전체의 학급유형, 전체인원을 계산한다.

 

 

쿼리>

WITH TMP_TBL AS (
    SELECT 

        '1' AS SCH_GRADE, '이과' AS TYPE_CLASS, '1' AS SCH_CLASS, 10 AS STUDENT_NUM 

    FROM DUAL
    UNION ALL
    SELECT 

        '1' AS SCH_GRADE, '문과' AS TYPE_CLASS, '2' AS SCH_CLASS, 11 AS STUDENT_NUM 

    FROM DUAL
    UNION ALL
    SELECT 

        '2' AS SCH_GRADE, '이과' AS TYPE_CLASS, '1' AS SCH_CLASS, 20 AS STUDENT_NUM 

    FROM DUAL
    UNION ALL
    SELECT 
        '2' AS SCH_GRADE, '문과' AS TYPE_CLASS, '2' AS SCH_CLASS, 22 AS STUDENT_NUM 

    FROM DUAL

SELECT 
    SCH_GRADE || CASE WHEN SCH_GRADE IS NOT NULL THEN '학년' ELSE '전체' END AS 학년
    , TYPE_CLASS AS 학급유형
    , SUM(STUDENT_NUM) || '명' AS 명
FROM TMP_TBL
    GROUP BY CUBE (SCH_GRADE, TYPE_CLASS)
    ORDER BY SCH_GRADE, TYPE_CLASS;

 

 

결과>

학년 학급유형 명
1학년 문과 11명
1학년 이과 10명
1학년 21명
2학년 문과 22명
2학년 이과 20명
2학년 42명
전체 문과 33명
전체 이과 30명
전체 63명

 

출처>

오라클 공식 문서

https://docs.oracle.com/cd/F49540_01/DOC/server.815/a68003/rollup_c.htm

 

CUBE enables a SELECT statement to calculate subtotals for all possible combinations of a group of dimensions. It also calculates a grand total. This is the set of information typically needed for all cross-tabular reports, so CUBE can calculate a cross-tabular report with a single SELECT statement. Like ROLLUPCUBE is a simple extension to the GROUP BY clause, and its syntax is also easy to learn.

 

728x90

+ Recent posts