Programming/Oracle2016. 5. 16. 23:56


오라클 합계, 소계 구하기

GROUP BY ROLLUP을 이용하면 합계와 소계를 쉽게 구할 수 있다.


WITH TMP AS (
SELECT 'AA' AS DEPTNO, '111' AS EMPNO, 100 AS SAL FROM DUAL UNION ALL
SELECT 'AA' AS DEPTNO, '111' AS EMPNO, 200 AS SAL FROM DUAL UNION ALL
SELECT 'AA' AS DEPTNO, '222' AS EMPNO, 110 AS SAL FROM DUAL UNION ALL
SELECT 'BB' AS DEPTNO, '333' AS EMPNO, 120 AS SAL FROM DUAL UNION ALL
SELECT 'BB' AS DEPTNO, '444' AS EMPNO, 130 AS SAL FROM DUAL UNION ALL
SELECT 'CC' AS DEPTNO, '555' AS EMPNO, 140 AS SAL FROM DUAL UNION ALL
SELECT 'CC' AS DEPTNO, '666' AS EMPNO, 150 AS SAL FROM DUAL
)
SELECT
          DEPTNO
        , CASE GROUPING_ID(DEPTNO, EMPNO) WHEN 1 THEN '소계'
                                                             WHEN 3 THEN '합계'
                                                             ELSE EMPNO
           END AS EMPNO
        , SUM(SAL) AS SAL
        , GROUPING(DEPTNO) AS DEPTNO_G
        , GROUPING(EMPNO) AS EMPNO_G
        , GROUPING_ID(DEPTNO, EMPNO) AS GP_ID
        --, GROUP_ID() AS G_ID
 FROM TMP
GROUP BY ROLLUP(DEPTNO, EMPNO)
--HAVING GROUPING_ID(DEPTNO, EMPNO) != 3 -- 소계만
--HAVING GROUPING_ID(DEPTNO, EMPNO) != 1 -- 합계만
--GROUP BY CUBE(DEPTNO, EMPNO)
--GROUP BY ROLLUP((DEPTNO, EMPNO)) -- 괄호로 묶으면 하나의 항목처럼 처리가능

=> 결
DEPTNO  EMPNO  SAL  DEPTNO_G  EMPNO_G  GP_ID
----------------------------------------------------------------------------------------
AA         111        300              0              0        0
AA         222        110              0              0        0
AA         소계       410              0              1        1
BB         333        120              0              0        0
BB         444        130              0              0        0
BB         소계       250              0              1        1
CC         555        140              0              0        0
CC         666        150              0              0        0
CC         소계       290              0              1        1
             합계       950              1              1        3
 

GROUP BY ROLLUP
그룹별로 합을 추가

GROUP BY CUBE
모든 경우의 수에 대해 그룹핑


GROUPING(), GROUPING_ID(), GROUP_ID()
ROLLUP, CUBE 사용시 발생된 결과를 구분하기 위한 함수

GROUPING(A)
A컬럼으로 그룹이 지어진결과는 0, 합산된 결과는 1

GROUPING_ID(A, B)
GROUPING(A) || GROUPING(B)를 2진수로 보고 10진수로 환산
00 -> 0, 01 -> 1, 11 -> 3

GROUP_ID()
GROUP BY ROLLUP(A, A)
동일 항목으로 롤업했을때 결과를 구별하기 위해 사용



'Programming > Oracle' 카테고리의 다른 글

오라클 시간계산  (1) 2017.04.18
Oracle 기타  (0) 2016.07.26
오라클 분석함수  (0) 2016.05.12
오라클 with  (0) 2016.05.10
Oracle Table Function  (0) 2016.04.28
Posted by jvvj