본문 바로가기

Oracle/ROLLUP, CUBE

ROLLUP, CUBE

ROLLUP 을 테스트해 보자.

GROUP BY ROLLUP

ROLLUP을 사용하면 그룹을 계층구조로 생성하고 그 계층구조 안에서 통계(그룹함수 적용)를 산출한다.
만약, 그룹의 계층구조를 벗어나서 각 그룹이 독립적으로 존재할 경우의 통계도 필요하다면 CUBE를 사용한다.

다음 문장은 부서별로 큰 그룹을 형성하고, 그 그룹내부에서 job 컬럼의 값이 동일한 레코드끼리
소그룹을 형성한 후, 먼저 소그룹에 그룹함수(sum)를 적용하고, 이어서 큰 그룹에 그룹함수를 적용하고,
마지막으로 전체 레코드에 그룹함수를 적용하는 예이다.

select deptno, job, sum(sal) from emp GROUP BY ROLLUP(deptno, job);
    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
        10 CLERK               1300
        10 MANAGER          2450
        10 PRESIDENT         5000
        10                          8750
        20 CLERK               1900
        20 ANALYST           6000
        20 MANAGER          2975
        20                          10875
        30 CLERK               950
        30 MANAGER          2850
        30 SALESMAN        5600
        30                          9400
                                     29025
13 개의 행이 선택되었습니다.

....................................................................................................................................................................................................

ROLLUP을 사용하지 않은 경우 비교

ROLLUP은 주어진 컬럼명을 이용하여 그룹을 생성할 때 계층구조로 생성하고 생성된 계층구조 안에서 그룹함수를 적용한다.
즉, 아래에 주어진 컬럼명(deptno, job)은 emp테이블을 최상위 그룹으로 하여 그 아래에 deptno 그룹을 생성하고,
생성된 deptno그룹 아래에 job 그룹을 생성한다.
위에서 다룬 ROLLUP의 결과와 아래의 일반 Group by 의 결과를 비교해보면 ROLLUP의 의미가 분명해진다.
아래의 문장은 부서내의 직무별 합계는 출력되지만 부서별 급여합계와 총합은 없다.

SQL> select deptno, job, sum(sal) from emp  GROUP BY (deptno, job);

    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
        20 CLERK               1900
        30 SALESMAN         5600
        20 MANAGER          2975
        30 CLERK                950
        10 PRESIDENT         5000
        30 MANAGER           2850
        10 CLERK               1300
        10 MANAGER          2450
        20 ANALYST            6000

9 개의 행이 선택되었습니다.

....................................................................................................................................................................................................

다음은 ROLLUP의 순서를 변경하여 테스트한 결과이다.
JOB이 동일한 레코드는 큰그룹이 되고, 그 그룹안에서 deptno컬럼값이 동일한 레코드는
소그룹으로 형성되어, 먼저 소 그룹에 그룹함수가 적용되고, 이어서 큰그룹에 그룹함수가 적용된다.
마지막으로 전체 레코드에 그룹함수가 적용되는 것은 동일하다.

SQL> select deptno, job, sum(sal) from emp  GROUP BY ROLLUP(job, deptno);

    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
        10 CLERK                1300
        20 CLERK                 1900
        30 CLERK                 950
              CLERK               4150
        20 ANALYST             6000
              ANALYST           6000
        10 MANAGER           2450
        20 MANAGER           2975
        30 MANAGER           2850
              MANAGER         8275
        30 SALESMAN         5600
              SALESMAN       5600
        10 PRESIDENT         5000
              PRESIDENT       5000
                                     29025

15 개의 행이 선택되었습니다.

....................................................................................................................................................................................................

ROLLUP 테스트 결과 정리

GROUP BY ROLLUP ( COL_A , COL_B)
==>
COL_A컬럼의 값이 동일한 레코드끼리 큰 그룹을 형성하고,
그 그룹 안에서 COL_B컬럼의 값이 동일한 레코드끼리 소 그룹을 형성하여,
소그룹에 그룹함수(SUM(sal)과 같은)를 먼저 적용한 후, 큰 그룹에 그룹함수를 적용한다.
마지막에는 전체 레코드에 그룹함수를 적용하여 결과를 출력한다.

참고로 GROUP BY만 사용하여 그룹을 형성하는 경우와 ROLLUP을 사용하여 그룹을 형성하는 경우의 차이점은,
GROUP BY만 사용하면 그룹안에 그룹을 형성한다는 개념이 없고 , ROLLUP을 사용하면 그룹안에 그룹을 형성
하여 그룹함수를 적용할 수 있다는 점이다.


....................................................................................................................................................................................................


GROUP BY CUBE

GROUP BY ROLLUP의 기능에 추가하여 가능한 모든 경우의 그룹을 형성하여 그룹함수를 적용할 수 있게 한다.
ROLLUP의 기능을 포함하고, 제시된 컬럼명을 이용하여 계층구조를 생성할 뿐만 아니라 각 컬럼명을 독립적인 그룹으로 간주하여 그룹함수를 적용한다. 아래의 파란색으로 표시한 결과는 ROLLUP에서 볼 수 없었던 내용이다.
다음문장의 결과는 ROLLUP의 결과에 추가하여 직무별로 그룹을 형성하고 그룹함수를 적용한 결과를 보여주고 있다.

SQL> select deptno, job, sum(sal) from emp  GROUP BY CUBE(deptno, job);

    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
                                   29025
           CLERK              4150
           ANALYST          6000
           MANAGER         8275
           SALESMAN       5600
           PRESIDENT       5000

        10                       8750
        10 CLERK            1300
        10 MANAGER       2450
        10 PRESIDENT      5000
        20                       10875
        20 CLERK            1900
        20 ANALYST         6000
        20 MANAGER       2975
        30                       9400
        30 CLERK            950
        30 MANAGER       2850
        30 SALESMAN      5600

18 개의 행이 선택되었습니다.