본문 바로가기
DataBase/Oracle

ROLLUP

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

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

 

CUBE가 궁금하다면

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

 

CUBE

CUBE에 대해서 간단하게 알아보자. CUBE(expr1, expr2, ...) CUBE는 ROLLUP과 비슷하나 약간 다르다. ROLLUP이 궁금하다면 https://fox-dev-diary.tistory.com/entry/ROLLUP ROLLUP ROLLUP에 대해서 간단하게! 알아보자. ROLLUP(exp

fox-dev-diary.tistory.com

 

ROLLUP(expr1, expr2...)

ROLLUP은 expr로 명시한 표현식을 기준으로 추가적인 집계 정보를 보여준다.

표현식에는 그룹핑 대상(SELECT에서 집계 함수를 제외한 컬럼 등)이 오며

명시한 표현식 수와 순서에 따라 0집계 결과가 나온다.

표현식 개수가 n개이면 n+1 레벨까지,

하위 레벨에서 상위 레벨 순으로 데이터가 집계된다.

 

먼저 간단한 GROUP BY절을 보자.

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

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

여기서 ROLLUP을 사용해보자.

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

결과를 보면 period에 관한 소계와 전체 합계가 나온다.

ROLLUP(period, gubun)이므로 3레벨까지 나오는 것인데 아래와 같이 생각하면 된다.

(period, gubun) >> 3

(period) >> 2

() >> 1

ROLL UP이 말아올린다는 느낌이니 표현식을 하나씩 말아올려서 레벨을 정한다고 생각하면 되겠다.

 

참고로 위의 조회 결과에 null 말고 다른 값을 넣어주고 싶다면

아래와 같이 DECODE함수나 CASE문 등으로 SELECT해주면 되겠다.

SELECT DECODE(period, NULL, '합계', period) period
     , CASE WHEN period IS NOT NULL AND gubun IS NULL THEN '소계'
            WHEN period IS NULL AND gubun IS NULL THEN ' '
            ELSE gubun
       END gubun
     , SUM(loan_jan_amt) total_jan
  FROM kor_loan_status
 WHERE period LIKE '2013%'
 GROUP BY ROLLUP(period, gubun)
 ORDER BY 1;

 

분할 ROLLUP

ROLLUP을 다른 유형으로 사용해보자.

예를 들어서 GROUP BY expr1 ROLLUP(expr2, expr3)으로 사용한다면

레벨은  3레벨이 되지만,

결과는 (expr1, expr2, expr3), (expr1, expr2), (expr1) 별로 집계가 되고

전체 합계는 집계되지 않는다.

이런 식의 ROLLUP을 분할(partial) ROLLUP이라 한다.

쿼리로 예시를 보자.

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

위의 설명을 토대로 결과를 예상하자면 레벨은 1+1로 2레벨 까지 나올테고 

(period, gubun) >> 2

(period) >> 1

형식으로 전체 합계는 집계되지 않을 것이다.

예상대로 결과가 나왔다.

 

ROLLUP을 사용하여 소계, 전체 합계 등을 출력하는 쿼리는 많이 사용되니 꼭 알아두자.

 

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' 카테고리의 다른 글

묵시적 커서(CURSOR)  (0) 2023.10.31
CUBE  (0) 2023.10.31
WITH절  (1) 2023.10.16
계층형 쿼리에서 제공되는 의사컬럼과 함수  (0) 2023.10.16
계층형쿼리  (0) 2023.10.13