27. CUBE

CUBE()

ROLLUP()보다 더 디테일한 결과 반환

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

 

※ ROLLUP() 과 CUBE() 는 그룹을 묶어주는 방식이 다르다(차이)

EX.

ROLLUP(A, B, C)

→ (A, B, C) / (A, B) / (A) / ()

CUBE(A, B, C)

→ (A, B, C) / (A, B) / (A, C) / (B, C) / (A) / (B) / (C) / ()

ROLLUP()은 묶음 방식이 다소 모자라고 CUBE()는 묶음 방식이 다소 지나치기 때문에 조회하고자 하는 그룹만 『GROUPING SETS』를 이용하여 묶어주는 방식의 쿼리 형태를 더 많이 사용한다.

-- ROLLUP 사용
SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN NVL(TO_CHAR(DEPTNO), '인턴')
						ELSE '전체부서'
				END "부서번호"
		 , CASE GROUPING(JOB) WHEN 0 THEN JOB
						ELSE '전체직종'
        END "직종"
     , SUM(SAL) "급여합"
  FROM TBL_EMP
GROUP BY ROLLUP(DEPTNO, JOB)
ORDER BY 1, 2;
--==>>
/*
10	        CLERK	    1300
10	        MANAGER	  2450
10	        PRESIDENT	5000
10	        전체직종	8750
20	        ANALYST	  6000
20	        CLERK	    1900
20	        MANAGER	  2975
20	        전체직종	10875
30	        CLERK	    950
30	        MANAGER	  2850
30	        SALESMAN	5600
30	        전체직종	9400
인턴	      CLERK	    3500
인턴	      SALESMAN	5200
인턴	      전체직종	8700
전체부서	  전체직종	37725
*/

-- CUBE 사용
SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN NVL(TO_CHAR(DEPTNO), '인턴')
						ELSE '전체부서'
			  END "부서번호"
     , CASE GROUPING(JOB) WHEN 0 THEN JOB
						ELSE '전체직종'
			  END "직종"
     , SUM(SAL) "급여합" 
  FROM TBL_EMP
GROUP BY CUBE(DEPTNO, JOB)
ORDER BY 1, 2;
--==>>
/*
10		  	CLERK	    1300
10			  MANAGER	  2450
10			  PRESIDENT	5000
10			  전체직종	8750
20			  ANALYST	  6000
20			  CLERK	    1900
20		  	MANAGER	  2975
20		  	전체직종	10875
30			  CLERK	    950
30			  MANAGER	  2850
30		    SALESMAN	5600
30	      전체직종	9400
인턴	    CLERK	    3500
인턴	    SALESMAN	5200
인턴	    전체직종	8700
전체부서	ANALYST	  6000
전체부서	CLERK	    7650
전체부서	MANAGER	  8275
전체부서	PRESIDENT	5000
전체부서	SALESMAN	10800
전체부서	전체직종	37725
*/

 

GROUPING SETS

-- CUBE()를 사용한 결과와 같은 조회 결과
SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN NVL(TO_CHAR(DEPTNO), '인턴')
						ELSE '전체부서'
				END "부서번호"
     , CASE GROUPING(DEPTNO) WHEN 0 THEN JOB
						ELSE '전체직종'
        END "직종"
		 , SUM(SAL) "급여합"
  FROM TBL_EMP
GROUP BY GROUPING SETS((DEPTNO, JOB), (DEPTNO), (JOB), ())
--==>>
/*
10		  	CLERK	    1300
10			  MANAGER	  2450
10			  PRESIDENT	5000
10			  전체직종	8750
20			  ANALYST	  6000
20			  CLERK	    1900
20		  	MANAGER	  2975
20		  	전체직종	10875
30			  CLERK	    950
30			  MANAGER	  2850
30		    SALESMAN	5600
30	      전체직종	9400
인턴	    CLERK	    3500
인턴	    SALESMAN	5200
인턴	    전체직종	8700
전체부서	ANALYST	  6000
전체부서	CLERK	    7650
전체부서	MANAGER	  8275
전체부서	PRESIDENT	5000
전체부서	SALESMAN	10800
전체부서	전체직종	37725
*/

-- ROLLUP()을 사용한 결과와 같은 조회 결과
SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN NVL(TO_CHAR(DEPTNO), '인턴')
						ELSE '전체부서'
			  END "부서번호"
		 , CASE GROUPING(JOB) WHEN 0 THEN JOB
						ELSE '전체직종'
			  END "직종"
		 , SUM(SAL) "급여합"
  FROM TBL_EMP
GROUP BY GROUPING SETS((DEPTNO, JOB), (DEPTNO), ())
ORDER BY 1, 2;
--==>>
/*
10	        CLERK	    1300
10	        MANAGER	  2450
10	        PRESIDENT	5000
10	        전체직종	8750
20	        ANALYST	  6000
20	        CLERK	    1900
20	        MANAGER	  2975
20	        전체직종	10875
30	        CLERK	    950
30	        MANAGER	  2850
30	        SALESMAN	5600
30	        전체직종	9400
인턴	      CLERK	    3500
인턴	      SALESMAN	5200
인턴	      전체직종	8700
전체부서	  전체직종	37725
*/

 

 

 

 

 

 

 

 

 

 


https://www.instagram.com/p/CazkrN-vPAy/?utm_source=ig_web_copy_link

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

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


문제

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

29. 중첩 그룹함수 / 분석함수  (0) 2022.03.12
28. HAVING  (0) 2022.03.12
26. ROLLUP, GROUPING  (0) 2022.03.12
25. 그룹 함수  (0) 2022.03.12
24. RANK()  (0) 2022.03.12