-
Oracle - GROUP BY 의 ROLLUP과 CUBE데이터베이스/Oracle 2020. 11. 11. 17:26728x90반응형
ROLLUP / CUBE
ROLLUP과 CUBE는 그룹 별 산출한 결과 값의 집계를 계산하는 함수이다.
ROLLUP
ROLLUP이란 인자로 전달받은 그룹 중 가장 먼저 지정한 그룹별로 추가적 집계 결과를 반환한다.
즉, 그룹별 '중간집계' 와 '전체 집계'를 계산하여 결과를 행에 자동 추가해주는 함수이다.
[ ROLLUP 예시 ]
- EMPLOYEE 테이블에서 각 부서 마다 직급 별 급여합, 부서 별 급여 합, 전체 직원 급여 총합 조회
SELECT DEPT_CODE, JOB_CODE, SUM(SALARY) FROM EMPLOYEE GROUP BY ROLLUP(DEPT_CODE, JOB_CODE) ORDER BY 1;
CUBE
CUBE란 인자로 지정된 그룹들로 가능한 모든 조합 별로 집계한 결과 반환한다.
즉, ROLLUP + 그룹으로 지정된 모든 그룹에 대한 집계 결과를 추가한다.
[ CUBE 예시 ]
SELECT DEPT_CODE, JOB_CODE, SUM(SALARY) FROM EMPLOYEE GROUP BY CUBE(DEPT_CODE, JOB_CODE) ORDER BY 1;
GROUPING
GROUPING이란 ROLLUP이나 CUBE에 의한 집계 산출물이
인자로 전달받은 컬럼 집합의 산출물이면 0 반환 아니면 1 을 반환한다.
[ GROUPING 예시 ]
SELECT DEPT_CODE, JOB_CODE, SUM(SALARY), GROUPING(DEPT_CODE) "부서별 그룹", GROUPING(JOB_CODE) "직급별 그룹" FROM EMPLOYEE GROUP BY CUBE(DEPT_CODE, JOB_CODE) ORDER BY DEPT_CODE;
GROUPING의 또다른 예시
SELECT DEPT_CODE, JOB_CODE, SUM(SALARY), CASE WHEN GROUPING(DEPT_CODE) = 0 AND GROUPING(JOB_CODE) = 1 THEN '부서' WHEN GROUPING(DEPT_CODE) = 1 AND GROUPING(JOB_CODE) = 0 THEN '직급' WHEN GROUPING(DEPT_CODE) = 1 AND GROUPING(JOB_CODE) = 1 THEN '총합' ELSE '부서+직급' END AS 구분 FROM EMPLOYEE GROUP BY CUBE(DEPT_CODE, JOB_CODE) ORDER BY DEPT_CODE;
728x90반응형'데이터베이스 > Oracle' 카테고리의 다른 글
Oracle - CROSS JOIN / NON_EQUI JOIN / SELF JOIN (0) 2020.11.13 Oracle - JOIN (0) 2020.11.12 Oracle - ORDER BY / GROUP BY / HAVING (0) 2020.11.11 Oracle 함수(Function) - 그룹 함수 (0) 2020.11.11 Oracle 함수(Function) - NULL 처리 함수와 선택 함수 (0) 2020.11.11