ORACLE ROLLUP, CUBE 예제
오라클에서 ROLLUP 함수와 CUBE 함수는 그룹함수로 제공되고 있습니다.
GROUP BY 절에 사용할 수 있는데 각각 함수의 정의는 다음과 같습니다.
ROLLUP : 그룹핑 결과에 그룹지은 컬럼의 합계 정보를 추가 조회
CUBE : 그룹으로 지정한 모든 컬럼의 집계 정보를 조회
비슷한 함수로 사용되지만 결과는 조금 다를 수 있습니다.
어떻게 다른지 예제로 확인해보도록 하겠습니다.
#GROUP BY
SELECT T1.JOB
, T2.DNAME
, T2.LOC
, SUM(T1.SAL) AS SALARY
FROM SCOTT.EMP T1
INNER JOIN SCOTT.DEPT T2
ON T1.DEPTNO = T2.DEPTNO
GROUP BY T1.JOB
, T2.DNAME
, T2.LOC
일반적인 GROUP BY 후 SUM 을 한 결과입니다.
JOB 과 DNAME 을 그룹핑 후 SAL 값의 합계를 조회한 것을 알 수 있습니다.
#ROLLUP
SELECT T1.JOB
, T2.DNAME
, T2.LOC
, SUM(T1.SAL) AS SALARY
FROM SCOTT.EMP T1
INNER JOIN SCOTT.DEPT T2
ON T1.DEPTNO = T2.DEPTNO
GROUP BY ROLLUP(T1.JOB, T2.DNAME, T2.LOC)
GROUP BY 절 안에 ROLLUP 함수를 사용하므로써
JOB, DNAME, LOC 별로 SALARY 의 소계값이 조회되고
가장 마지막에 JOB과 DNAME과 LOC 의 최종합계값, 즉 ROW DATA 의 전체합계가 조회된 것을 볼 수 있습니다.
#CUBE
SELECT T1.JOB
, T2.DNAME
, T2.LOC
, SUM(T1.SAL) AS SALARY
FROM SCOTT.EMP T1
INNER JOIN SCOTT.DEPT T2
ON T1.DEPTNO = T2.DEPTNO
GROUP BY CUBE(T1.JOB, T2.DNAME, T2.LOC)
CUBE 함수를 사용하면 ROLLUP 에서 사용했던
JOB, DNAME, LOC 별 소계값이 동일하게 조회되며
추가적으로 파란색 네모칸으로 조회되는 DNAME(부서)별 SALARY 의 합계값 까지 조회되는 것을 볼 수 있습니다.
CUBE 함수를 사용하면 GROUP BY 한 모든 항목에 대해서 집계값을 조회할 수 있는 것을 알 수 있네요
조회할 수 있는 모든 조합의 집계 정보를 보고 싶다면 CUBE 함수를 사용할 수 있습니다.
너무 많은 정보가 조회되어 데이터를 추출하는데 어려움이 있다면
조회조건을 추가하면 좀 더 간략한 정보를 볼 수 있으니 참고하시면 될 것 같습니다.
SELECT T1.JOB
, T2.DNAME
, T2.LOC
, SUM(T1.SAL) AS SALARY
FROM SCOTT.EMP T1
INNER JOIN SCOTT.DEPT T2
ON T1.DEPTNO = T2.DEPTNO
WHERE JOB = 'MANAGER'
GROUP BY CUBE(T1.JOB, T2.DNAME, T2.LOC)
ROLLUP 과 CUBE 의 결정적인 차이점이라고 한다면
ROLLUP 은 ROLLUP 함수 안에 들어온 컬럼수 + 1 개의 결과가 조회되며
CUBE 는 CUBE 함수 안에 들어온 컬럼수의 2의 n 승개의 결과가 조회되는것이 가장 크다고 볼 수 있네요
제가 사용한 예제는 GROUP BY 는 3 + 1 = 3 , CUBE 는 2*2*2 = 8 개의 결과가 나오는 것을 확인할 수 있습니다.
ROLLUP 이나 CUBE 함수는 실제로 많이 사용하지는 않지만 이런 기능이 있다 정도로만 알고 있으면 될 것 같습니다.
읽어주셔서 감사합니다.
'IT > Oracle' 카테고리의 다른 글
plsql 오라클 프로시저 파라미터 테이블에 사용 (0) | 2020.08.25 |
---|---|
ORACLE INSTR 함수 사용방법 (0) | 2020.06.02 |
ORA-03214: 지정된 파일 크기가 기본 최소치보다 작습니다 ( 테이블스페이스 생성 ) (0) | 2020.03.31 |
오라클 TO_DATE 1분만에 완벽마스터로 변신 (0) | 2020.03.24 |
오라클 계정생성, 권한부여 명령어 1초만에 습득 (2) | 2019.08.23 |