2013. 2. 13. 09:20

[Oracle] ROLLUP, GROUPING SETS

** ROLLUP

 

- 그룹조건에 따라 전체 행을 그룹화하고, 각 그룹에 대한 부분합을 구하는 연산자

 

- ROLLUP절에는 255개의 컬럼까지 가능

 

- ROLLUP절에 컬럼의 개수가 n개이면 그룹핑 조합은 n + 1개

 

 

** GROUPING SETS

 

- 동일한 퀴리에 대해서 다양한 그룹핑을 정의 가능

 

- 개별로 그룹핑하여 UNION ALL한 경우와 동일하나, 성능적인 면에서 뛰어남

 

 

SQL >

 SELECT JBDATE, BAYONG, SUM(CHARGE) CHARGE
   FROM INVCON
  WHERE JBDATE BETWEEN '2013-02-04' AND '2013-02-06'
    AND BAYONG IN ('BS01','BS03')
GROUP BY ROLLUP (JBDATE, BAYONG);

 

 

SQL >

 SELECT JBDATE, BAYONG, SUM(CHARGE) CHARGE
   FROM INVCON
  WHERE JBDATE BETWEEN '2013-02-04' AND '2013-02-06'
    AND BAYONG IN ('BS01','BS03')
  GROUP BY GROUPING SETS ((JBDATE, BAYONG), (JBDATE), ());

 

 

>> 동일한 결과 나옴

JBDATE     BAYO     CHARGE
---------- ---- ----------
2013-02-04 BS01      90508
2013-02-04 BS03     559711
2013-02-04            650219
2013-02-05 BS01     176733
2013-02-05 BS03     533863
2013-02-05            710596
2013-02-06 BS01      93938
2013-02-06 BS03     371616
2013-02-06            465554
                          1826369

 

 

SQL >

 SELECT JBDATE, BAYONG, SUM(CHARGE) CHARGE
   FROM INVCON
  WHERE JBDATE BETWEEN '2013-02-04' AND '2013-02-06'
    AND BAYONG IN ('BS01','BS03')
  GROUP BY GROUPING SETS ((JBDATE, BAYONG),());

 

 

>> JBDATE의 그룹핑은 제외

JBDATE     BAYO     CHARGE
---------- ---- ----------
2013-02-04 BS01      90508
2013-02-04 BS03     559711
2013-02-05 BS01     176733
2013-02-05 BS03     533863
2013-02-06 BS01      93938
2013-02-06 BS03     371616
                          1826369