오라클 rollup 예제

오라클에서 항목별 부분합, 전체합을 쉽게 구현하는 예제. 데이터는 서울시 동별 인구,  구별 합계, 전체합계를 구하는 예제이다. 

WITH BASE AS (
    SELECT '마포구' GU, 1 GU_ODR, '연남동' DONG, 1 DONG_ODR, 12 QTY FROM DUAL UNION ALL
    SELECT '마포구' GU, 1 GU_ODR, '공덕동' DONG, 4 DONG_ODR, 31 QTY FROM DUAL UNION ALL
    SELECT '마포구' GU, 1 GU_ODR, '상암동' DONG, 3 DONG_ODR, 78 QTY FROM DUAL UNION ALL
    SELECT '마포구' GU, 1 GU_ODR, '동교동' DONG, 2 DONG_ODR, 34 QTY FROM DUAL UNION ALL
    SELECT '강남구' GU, 2 GU_ODR, '도곡동' DONG, 3 DONG_ODR, 25 QTY FROM DUAL UNION ALL
    SELECT '강남구' GU, 2 GU_ODR, '논현동' DONG, 2 DONG_ODR, 33 QTY FROM DUAL UNION ALL
    SELECT '강남구' GU, 2 GU_ODR, '삼성동' DONG, 1 DONG_ODR, 39 QTY FROM DUAL 
)
SELECT CASE WHEN B.GU IS NULL THEN 'Total'
       ELSE B.GU END AS GU
     , B.GU_ODR
     , CASE WHEN B.GU IS NOT NULL AND B.DONG IS NULL THEN 'Total'
       ELSE B.DONG END AS DONG
     , B.DONG_ODR
     , SUM(QTY) AS QTY
  FROM BASE         B
 WHERE 1=1
 GROUP BY ROLLUP (
    (B.GU, B.GU_ODR), (B.DONG, B.DONG_ODR)
 )
 ORDER BY
       B.GU_ODR NULLS FIRST, B.GU NULLS FIRST
     , B.DONG_ODR NULLS FIRST, B.DONG NULLS FIRST

아래는 실행 결과이다. 합계(Total) 부분을 아래로 정렬하려면 Order by에서 Nulls First부분을 제거하면 된다.

oracle rollup result