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 개의 행이 선택되었습니다.