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에 명시한 표현식 개수에 따라 레벨이 정해지고 하위 레벨부터 상위 레벨로 “말아 올려진” 집계 결과가 계산된다고 생각하면 이해하기 쉬울 것이다.