더북(TheBook)

ROLLUP(expr1, expr2, …)

ROLLUP은 expr로 명시한 표현식을 기준으로 집계한 결과, 즉 추가적인 집계 정보를 보여 준다. ROLLUP 절에 명시할 수 있는 표현식에는 그룹핑 대상, 즉 SELECT 리스트에서 집계 함수를 제외한 컬럼 등의 표현식이 올 수 있으며, 명시한 표현식 수와 순서(오른쪽에서 왼쪽 순으로)에 따라 레벨별로 집계한 결과가 반환된다. 표현식 개수가 n개이면 n+1 레벨까지, 하위 레벨에서 상위 레벨 순으로 데이터가 집계된다.

입력

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

결과

    PERIOD    GUBUN          TOTL_JAN
    -------- --------------- --------------------------
    201310   기타대출         676078
    201310   주택담보대출     411415.9
    201311   기타대출         681121.3
    201311   주택담보대출     414236.9

위 쿼리는 2013년도 대출 종류별 총 잔액을 구한 것이다. 이제 ROLLUP을 사용해 보자.

입력

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

결과

    PERIOD   GUBUN                 TOTL_JAN
    -------- -------------------- -----------------------
    201310   기타대출              676078     →③
    201310   주택담보대출          411415.9   →③
    201310                         1087493.9  →②
    201311   기타대출              681121.3   →③
    201311   주택담보대출          414236.9   →③
    201311                         1095358.2  →②
                                   2182852.1  →①

ROLLUP 절에 period와 gubun을 명시했으므로, 총 레벨 수는 3이다. 순서대로 풀어 보면, ③ 레벨은 월과 대출종류(period, gubun), ② 레벨은 월(period), ① 레벨은 전체 합계가 집계된 것을 확인할 수 있다.

ROLLUP은 또 다른 유형으로 사용할 수 있는데 예를 들어, GROUP BY expr1, ROLLUP(expr2, expr3)로 명시했다면, 레벨은 ‘2+1=3’레벨이 되지만 결과는 (expr1, expr2, expr3), (expr1, expr2), (expr1)별로 집계가 되고 전체 합계는 집계되지 않는다. 이런 유형을 분할(partial) ROLLUP이라고 한다.

입력

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

결과

    PERIOD   GUBUN                 TOTL_JAN
    -------- -------------------- -----------------------
    201310   기타대출              676078    →②
    201310   주택담보대출          411415.9  →②
    201310                         1087493.9 →①
    201311   기타대출              681121.3  →②
    201311   주택담보대출          414236.9  →②
    201311                         1095358.2 →①

위 쿼리에서는 GROUP BY 절에 period, ROLLUP(gubun)을 명시했으므로 전체 레벨은 ‘1+1=2’가 되는데, (period, gubun)이 ② 레벨, (period)가 ① 레벨로 집계되었다.

입력

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

결과

    PERIOD   GUBUN                TOTL_JAN
    -------- ------------------- --------------------------
    201310   기타대출             676078   →②
    201311   기타대출             681121.3 →②
             기타대출             1357199.3→①
    201310   주택담보대출         411415.9 →②
    201311   주택담보대출         414236.9 →②
             주택담보대출         825652.8 →①

이 쿼리는 ROLLUP(period), gubun 형태이므로 (gubun, period)가 2레벨, (gubun)이 1레벨이 되어 집계되었다. ROLLUP이 “말아 올린다”라는 의미이므로, ROLLUP에 명시한 표현식 개수에 따라 레벨이 정해지고 하위 레벨부터 상위 레벨로 “말아 올려진” 집계 결과가 계산된다고 생각하면 이해하기 쉬울 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.