CUBE(expr1, expr2, …)
CUBE는 ROLLUP과 비슷하나 개념이 약간 다르다. ROLLUP이 레벨별로 순차적 집계를 했다면, CUBE는 명시한 표현식 개수에 따라 가능한 모든 조합별로 집계한 결과를 반환한다. CUBE는 2의(expr 수)제곱 만큼 종류별로 집계 된다. 예를 들어, expr 수가 3이면, 집계 결과의 유형은 총 2^3^ = 8개가 된다.
입력
SELECT period, gubun, SUM(loan_jan_amt) totl_jan
FROM kor_loan_status
WHERE period LIKE '2013%'
GROUP BY CUBE(period, gubun) ;
결과
PERIOD GUBUN TOTL_JAN
-------- -------------- -------------
2182852.1 →①
기타대출 1357199.3 →②
주택담보대출 825652.8 →②
201310 1087493.9 →③
201310 기타대출 676078 →④
201310 주택담보대출 411415.9 →④
201311 1095358.2 →③
201311 기타대출 681121.3 →④
201311 주택담보대출 414236.9 →④
expr 수가 2이므로 2^2^ = 4가 되어 총 네 가지 유형으로 집계가 되는데, 위 결과를 보면 전체(①), 대출종류별(②), 월별 (③), 월별 대출 종류별(④)로 잔액이 집계되었다.
ROLLUP과 마찬가지로 분할 CUBE 유형도 사용할 수 있다. 예를 들어 GROUP BY expr1, CUBE(expr2, expr3)로 명시했을 때, (expr1, expr2, expr3), (expr1, expr2), (expr1, expr3), (expr1) 총 4가지(2^2^) 유형으로 집계된다.
입력
SELECT period, gubun, SUM(loan_jan_amt) totl_jan
FROM kor_loan_status
WHERE period LIKE '2013%'
GROUP BY period, CUBE( gubun );
결과
PERIOD GUBUN TOTL_JAN
-------- ------------- ---------------
201310 1087493.9
201310 기타대출 676078
201310 주택담보대출 411415.9
201311 1095358.2
201311 기타대출 681121.3
201311 주택담보대출 414236.9
위 공식에 따라 분할해보면, (period, gubun), (period)별로 집계된 것을 확인할 수 있다.
ROLLUP과 CUBE 개념은 알 듯 하면서도 좀 혼동되는 측면이 있다. 간단히 정리해 보면 표현식 개수에 따라 ROLLUP은 레벨별로, CUBE는 가능한 조합별로 집계를 수행한다고 이해하자. 다음의 표는 ROLLUP과 CUBE 표현식 개수별 집계 유형을 표현한 것이다.
표현식 | 집계 종류 |
ROLLUP(expr1, expr2) | expr1 + expr2 |
expr1 | |
전체 | |
GROUP BY expr1, ROLLUP (expr2, expr3) | expr1 + ( expr2 + expr3) |
expr1 + ( expr2) | |
expr1 | |
GROUP BY ROLLUP(expr1), expr2 | expr2 + expr1 |
expr2 | |
CUBE (expr1, expr2) | expr1 + expr2 |
expr1 | |
expr2 | |
전체 | |
GROUP BY expr1, CUBE ( expr2, expr3) | expr1 + ( expr2 + expr3) |
expr1 + ( expr2) | |
expr1 + ( expr3) | |
expr1 |