26. ROLLUP, GROUPING

ROLLUP

총합

SELECT DEPTNO "부서번호", SUM(SAL) "급여합"
  FROM TBL_EMP
GROUP BY ROLLUP(DEPTNO);
--==>>
/*
10 8750
20	10875
30 9400
(null) 8700 -- 부서번호를 갖지 못한 직원들의 급여합
(null)	37725 -- 모든부서 직원들의 급여합
*/
-- TBL_EMP의 경우 DEPTNO이 NULL인 경우가 포함되어 있다.

SELECT NVL2(DEPTNO, TO_CHAR(DEPTNO), '모든부서') "부서번호", SUM(SAL) "급여합"
  FROM EMP
GROUP BY ROLLUP(DEPTNO);
--==>>
/*
10	8750
20	10875
30	9400
모든부서	29025
*/
-- EMP의 경우 DEPTNO가 NULL인 값이 없어 이렇게 처리 가능
-- 반면 DEPTNO에 NULL이 존재하는 TBL_EMP의 경우는 NVL을 사용해도 아래와 같은 문제 발생
SELECT NVL(TO_CHAR(DEPTNO), '모든부서') "부서번호", SUM(SAL) "급여합"
FROM TBL_EMP
GROUP BY ROLLUP(DEPTNO);
--==>>
/*
10	8750
20	10875
30	9400
모든부서	8700
모든부서	37725
*/

이러한 문제는 GROUPING으로 해결 할 수 있다.

 

GROUPING()

총합으로 집계된 데이터는 1을 반환하고 아닐 경우 0을 반환

SELECT GROUPING(DEPTNO) "GROUPING", DEPTNO "부서번호", SUM(SAL) "급여합"
  FROM EMP
GROUP BY ROLLUP(DEPTNO);
--==>>
/*
0	10	8750
0	20	10875
0	30	9400
1		29025
*/

-- 위에서 TBL_EMP에서 NULL로 인한 문제의 경우 아래로 해결 가능
SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN NVL(TO_CHAR(DEPTNO), '인턴')
														 ELSE '모든부서'
        END "부서번호"
		 , SUM(SAL) "급여합"
  FROM TBL_EMP
GROUP BY ROLLUP(DEPTNO);
--==>>
/*
부서번호                                     급여합
10                                             8750
20                                            10875
30                                             9400
인턴                                           8700
모든부서                                      37725
*/

 

 

SELECT DEPTNO, JOB, SUM(SAL)
  FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB)
ORDER BY 1, 2;
--==>>
/*
10	    CLERK	      1300            -- 10번 부서 CLERK 직종의 급여합
10	    MANAGER	    2450            -- 10번 부서 MANAGER 직종의 급여합
10	    PRESIDENT	  5000            -- 10번 부서 PRESIDENT 직종의 급여합
10	    (null)	    8750            -- 10번 부서 모든 직종의 급여합        -- CHECK~!!!
20	    ANALYST	    6000            -- 20번 부서 ANALYST 직종의 급여합
20	    CLERK	      1900            -- 20번 부서 CLERK 직종의 급여합
20	    MANAGER	    2975                    :
20	    (null)	    10875           -- 20번 부서 모든 직종의 급여합        -- CHECK!!
30	    CLERK	      950
30	    MANAGER	    2850                    :
30	    SALESMAN	  5600
30	    (null)	    9400            -- 30번 부서 모든 직종의 급여합        -- CHECK!!
(null)  (null)	    29025           -- 모든 부서 모든 직종의 급여합        -- CHECK!!
*/

 

 

 

 


https://www.instagram.com/p/CahaPpylmtV/?utm_source=ig_web_copy_link

부족하거나 잘못된 내용이 있을 경우 댓글 달아주시면 감사하겠습니다.

이 글에 부족한 부분이 존재할 경우 추후에 수정될 수 있습니다.


GROUPING 문제1

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

28. HAVING  (0) 2022.03.12
27. CUBE  (0) 2022.03.12
25. 그룹 함수  (0) 2022.03.12
24. RANK()  (0) 2022.03.12
23. VIEW  (0) 2022.03.12