[출처] [ORACLE] ROLLUP 과 GROUPING|작성자 소토로

http://blog.naver.com/ssari93?Redirect=Log&logNo=120020259608





사용자 삽입 이미지
사용자 삽입 이미지

데이터

비용코드 TB_MSTCODE
MST_CD MST_NM
A00001 하드웨어
A00002 소프트웨어


서브비용코드 TB_SUBCODE
SUB_CD SUB_NM
B00001 사용료
B00002 관리비


년도별비용 TB_YEARCOST
MST_CD SUB_CD YEAR COST
A00001 B00001 2002 10000
A00001 B00001 2003 20000
A00001 B00001 2004 30000
A00001 B00001 2005 40000
A00001 B00002 2002 15000
A00001 B00002 2003 25000
A00001 B00002 2004 35000
A00001 B00002 2005 45000
A00002 B00001 2002 16000
A00002 B00001 2003 26000
A00002 B00001 2004 36000
A00002 B00001 2005 46000
A00002 B00002 2002 17000
A00002 B00002 2003 27000
A00002 B00002 2004 37000
A00002 B00002 2005 47000


년도별 비용 쿼리

SELECT  D.MST_NM
     ,  D.SUB_NM
     ,  SUM(DECODE(E.YEAR, '2002', E.COST, 0)) AS COST1
     ,  SUM(DECODE(E.YEAR, '2003', E.COST, 0)) AS COST2
     ,  SUM(DECODE(E.YEAR, '2004', E.COST, 0)) AS COST3
     ,  SUM(DECODE(E.YEAR, '2005', E.COST, 0)) AS COST4
  FROM  (SELECT  MST_CD
              ,  MST_NM
              ,  SUB_CD
              ,  SUB_NM
           FROM  (SELECT  MST_CD
                       ,  MST_NM
                    FROM  TB_MSTCODE) A
              ,  (SELECT  SUB_CD
                       ,  SUB_NM
                    FROM  TB_SUBCODE) B ) D
     ,  TB_YEARCOST E
 WHERE  D.MST_CD = E.MST_CD(+)
   AND  D.SUB_CD = E.SUB_CD(+)
 GROUP  BY  D.MST_NM
     ,  D.SUB_NM
 ORDER  BY  D.MST_NM
     ,  D.SUB_NM


결과

년도별 비용
MST_NM SUB_NM 2002년 2003년 2004년 2005년
소프트웨어 관리비 17000 27000 37000 47000
소프트웨어 사용료 16000 26000 36000 46000
하드웨어 관리비 15000 25000 35000 45000
하드웨어 사용료 10000 20000 30000 40000


아래와 같이 소계와 합계를 나타내고자 한다면

소계 및 합계
MST_NM SUB_NM 2002년 2003년 2004년 2005년
소프트웨어 관리비 17000 27000 37000 47000
사용료 16000 26000 36000 46000
소계 33000 53000 73000 93000
하드웨어 관리비 15000 25000 35000 45000
사용료 10000 20000 30000 40000
소계 25000 45000 65000 85000
합계 58000 98000 138000 178000


방법1

SELECT  D.MST_NM
     ,  D.SUB_NM
     ,  SUM(DECODE(E.YEAR, '2002', E.COST, 0)) AS COST1
     ,  SUM(DECODE(E.YEAR, '2003', E.COST, 0)) AS COST2
     ,  SUM(DECODE(E.YEAR, '2004', E.COST, 0)) AS COST3
     ,  SUM(DECODE(E.YEAR, '2005', E.COST, 0)) AS COST4
  FROM  (SELECT  MST_CD
              ,  MST_NM
              ,  SUB_CD
              ,  SUB_NM
           FROM  (SELECT  MST_CD
                       ,  MST_NM
                    FROM  TB_MSTCODE) A
              ,  (SELECT  SUB_CD
                       ,  SUB_NM
                    FROM  TB_SUBCODE) B ) D
     ,  TB_YEARCOST E
 WHERE  D.MST_CD = E.MST_CD(+)
   AND  D.SUB_CD = E.SUB_CD(+)
 GROUP  BY  ROLLUP(D.MST_NM
     ,  D.SUB_NM)

 ORDER  BY  D.MST_NM
     ,  D.SUB_NM


 

결과1

MST_NM SUB_NM COST1 COST2 COST3 COST4
소프트웨어 관리비 17000 27000 37000 47000
소프트웨어 사용료 16000 26000 36000 46000
소프트웨어   33000 53000 73000 93000
하드웨어 관리비 15000 25000 35000 45000
하드웨어 사용료 10000 20000 30000 40000
하드웨어   25000 45000 65000 85000
    58000 98000 138000 178000


방법2

SELECT  NVL(D.MST_NM, '합계') AS MST_NM
     ,  DECODE(D.MST_NM, NULL, '합계', NVL(D.SUB_NM, '소계')) AS SUB_NM
     ,  SUM(DECODE(E.YEAR, '2002', E.COST, 0)) AS COST1
     ,  SUM(DECODE(E.YEAR, '2003', E.COST, 0)) AS COST2
     ,  SUM(DECODE(E.YEAR, '2004', E.COST, 0)) AS COST3
     ,  SUM(DECODE(E.YEAR, '2005', E.COST, 0)) AS COST4
  FROM  (SELECT  MST_CD
              ,  MST_NM
              ,  SUB_CD
              ,  SUB_NM
           FROM  (SELECT  MST_CD
                       ,  MST_NM
                    FROM  TB_MSTCODE) A
              ,  (SELECT  SUB_CD
                       ,  SUB_NM
                    FROM  TB_SUBCODE) B ) D
     ,  TB_YEARCOST E
 WHERE  D.MST_CD = E.MST_CD(+)
   AND  D.SUB_CD = E.SUB_CD(+)
 GROUP  BY  ROLLUP(D.MST_NM
     ,  D.SUB_NM)
 ORDER  BY  D.MST_NM
     ,  D.SUB_NM


 

결과2

MST_NM SUB_NM COST1 COST2 COST3 COST4
소프트웨어 관리비 17000 27000 37000 47000
소프트웨어 사용료 16000 26000 36000 46000
소프트웨어 소계 33000 53000 73000 93000
하드웨어 관리비 15000 25000 35000 45000
하드웨어 사용료 10000 20000 30000 40000
하드웨어 소계 25000 45000 65000 85000
합계 합계 58000 98000 138000 178000

 

방법3

SELECT  DECODE(GROUPING(D.MST_NM), 1, '합계', D.MST_NM) AS MST_NM
     ,  DECODE(GROUPING(D.MST_NM), 1, '합계',
               DECODE(GROUPING(D.SUB_NM), 1, '소계', D.SUB_NM)) AS SUB_NM
     ,  SUM(DECODE(E.YEAR, '2002', E.COST, 0)) AS COST1
     ,  SUM(DECODE(E.YEAR, '2003', E.COST, 0)) AS COST2
     ,  SUM(DECODE(E.YEAR, '2004', E.COST, 0)) AS COST3
     ,  SUM(DECODE(E.YEAR, '2005', E.COST, 0)) AS COST4
  FROM  (SELECT  MST_CD
              ,  MST_NM
              ,  SUB_CD
              ,  SUB_NM
           FROM  (SELECT  MST_CD
                       ,  MST_NM
                    FROM  TB_MSTCODE) A
              ,  (SELECT  SUB_CD
                       ,  SUB_NM
                    FROM  TB_SUBCODE) B ) D
     ,  TB_YEARCOST E
 WHERE  D.MST_CD = E.MST_CD(+)
   AND  D.SUB_CD = E.SUB_CD(+)
 GROUP  BY  ROLLUP(D.MST_NM
     ,  D.SUB_NM)

 ORDER  BY  D.MST_NM
     ,  D.SUB_NM


 

결과3

MST_NM SUB_NM COST1 COST2 COST3 COST4
소프트웨어 관리비 17000 27000 37000 47000
소프트웨어 사용료 16000 26000 36000 46000
소프트웨어 소계 33000 53000 73000 93000
하드웨어 관리비 15000 25000 35000 45000
하드웨어 사용료 10000 20000 30000 40000
하드웨어 소계 25000 45000 65000 85000
합계 합계 58000 98000 138000 178000

※ 참고 : GROUPING 함수는 그룹핑 값이 NULL 이면 1을 리턴한다.


방법4

SELECT  DECODE(GROUPING(D.MST_NM), 1, '합계', D.MST_NM) AS MST_NM
     ,  DECODE(GROUPING(D.MST_NM), 1, '합계',
               DECODE(GROUPING(D.SUB_NM), 1, '소계', D.SUB_NM)) AS SUB_NM
     ,  SUM(DECODE(E.YEAR, '2002', E.COST, 0)) AS COST1
     ,  SUM(DECODE(E.YEAR, '2003', E.COST, 0)) AS COST2
     ,  SUM(DECODE(E.YEAR, '2004', E.COST, 0)) AS COST3
     ,  SUM(DECODE(E.YEAR, '2005', E.COST, 0)) AS COST4
  FROM  (SELECT  MST_CD
              ,  MST_NM
              ,  SUB_CD
              ,  SUB_NM
           FROM  (SELECT  MST_CD
                       ,  MST_NM
                    FROM  TB_MSTCODE) A
              ,  (SELECT  SUB_CD
                       ,  SUB_NM
                    FROM  TB_SUBCODE) B ) D
     ,  TB_YEARCOST E
 WHERE  D.MST_CD = E.MST_CD(+)
   AND  D.SUB_CD = E.SUB_CD(+)
 GROUP  BY  GROUPING SETS (
        (D.MST_NM, D.SUB_NM)
     ,  (D.MST_NM)
     ,  ())

 ORDER  BY  D.MST_NM
     ,  D.SUB_NM


 

결과4

MST_NM SUB_NM COST1 COST2 COST3 COST4
소프트웨어 관리비 17000 27000 37000 47000
소프트웨어 사용료 16000 26000 36000 46000
소프트웨어 소계 33000 53000 73000 93000
하드웨어 관리비 15000 25000 35000 45000
하드웨어 사용료 10000 20000 30000 40000
하드웨어 소계 25000 45000 65000 85000
합계 합계 58000 98000 138000 178000


 

 

+ Recent posts