본문 바로가기
DataBase/Oracle

CUBE

by 글발 2023. 10. 31.
728x90
반응형

CUBE에 대해서 간단하게 알아보자.

CUBE(expr1, expr2, ...)

CUBE는 ROLLUP과 비슷하나 약간 다르다.

ROLLUP이 궁금하다면

https://fox-dev-diary.tistory.com/entry/ROLLUP

 

ROLLUP

ROLLUP에 대해서 간단하게! 알아보자. ROLLUP(expr1, expr2...) ROLLUP은 expr로 명시한 표현식을 기준으로 추가적인 집계 정보를 보여준다. 표현식에는 그룹핑 대상(SELECT에서 집계 함수를 제외한 컬럼 등)

fox-dev-diary.tistory.com

ROLLUP은 레벨별로 순차적 집계를 했는데 

CUBE는 명시한 표현식 개수에 따라 가능한 모든 조합 별로 집계한 결과를 반환한다.

따라서 CUBE는 2의 (expr 수)제곱 만큼 종류 별로 집계된다.

예를 들어서 expr 수가 3이면 집계 결과의 유형은 8개가 된다.

 

다음은 간단한 GROUP BY 쿼리이다.

SELECT period, gubun, SUM(loan_jan_amt) total_jan
  FROM kor_loan_status
 WHERE period LIKE '2013%'
 GROUP BY period, gubun;

위 결과는 2013년도 월별, 대출종류별 총 잔액을 구한 것이다.

여기서 CUBE을 사용해보자.

SELECT period, gubun, SUM(loan_jan_amt) total_jan
  FROM kor_loan_status
 WHERE period LIKE '2013%'
 GROUP BY CUBE(period, gubun);

expr의 수가 두개이므로 유형은 네가지로 집계된다.

위 결과를 보면 전체, 대출종류별, 월별, 월별 대출종류별 이렇게 네가지 유형이 결과로 나온 것을 확인할 수 있다.

 

분할 CUBE

CUBE도 ROLLUP처럼 분할 CUBE로 활용할 수도 있다.

예를 들어서 GROUP BY expr1, CUBE(expr2, expr3)으로 활용했을 때 조합은 어떻게 나올까?

4가지가 나올텐데 4가지 유형으로는

(expr1, expr2, expr3), (expr1, expr2), (expr1, expr3), (expr1) 이렇게 집계가 된다.

SELECT period, gubun, SUM(loan_jan_amt) total_jan
  FROM kor_loan_status
 WHERE period LIKE '2013%'
 GROUP BY period, CUBE(gubun);

위 결과를 보면

(period, gubun), (period)로 집계가 된 것을 확인할 수 있다.

 

ROLLUP과 CUBE

ROLLUP과 CUBE는 사용을 하지 않다보면 혼동되고 헷갈리는 측면이 많다.

간단히 정리하자면 ROLLUP은 레벨 별로, CUBE는 가능한 조합 별로 집계를 수행한다.

간단하게 예시와 함께 정리를 해보자.

표현식 집계 종류
GROUP BY 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)
GROUP BY CUBE(expr1, expr2) (expr1, expr2)
(expr1)
(expr2)
(전체)
GROUP BY expr1, CUBE(expr2, expr3) (expr1, expr2, expr3)
(expr1, expr2)
(expr1, expr3)
(expr1)

 

 

 

'DataBase > Oracle' 카테고리의 다른 글

레코드(RECORD)  (1) 2023.11.01
묵시적 커서(CURSOR)  (0) 2023.10.31
ROLLUP  (0) 2023.10.30
WITH절  (1) 2023.10.16
계층형 쿼리에서 제공되는 의사컬럼과 함수  (0) 2023.10.16