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!!
*/
부족하거나 잘못된 내용이 있을 경우 댓글 달아주시면 감사하겠습니다.
이 글에 부족한 부분이 존재할 경우 추후에 수정될 수 있습니다.
'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 |