ROLLUP 기본사용법

Updated:

ROLLUP이란?

ROLLUP은 ANSI SQL 99표준에서 가장 많이 사용하는 함수로 이것을 잘 이용하면 쉽게 최적의 성능을 보장하는 SQL을 만들수 있습니다. ROLLUP을 잘 사용하기 위해서는 UNION ALL, WITH, ROLLUP, DECODE절간의 형태변환 개념을 이해해야 하는데 이부분은 다음 기회에 소개하겠습니다.

ROLLUP의 기본형태는 ROLLUP안에 들어가는 칼럼 개수로 1차원, 2차원, 3차원 ROLLUP등으로 나눌수 있으며, 그외 PARTIAL, GROUPING ON COMPOSITE 형태가 많이 사용되고 있습니다. 아래의 자료를 가지고 먼저 기본형태를 이해하고 다음에 실전예제를 풀어보면 ROLLUP을 쉽게 이해할수 있습니다.

ROLLUP은 UNION ALL로 만들어진 라인수가 많고 테이블에 중복접근하는 SQL을 가장 간략하게, 그리고 테이블에 한번만 접근하여 데이타를 조회할수 있습니다. 그러므로 성능상 최고의 위치에 있는 기술중 하나입니다.

ROLLUP의 기본사용법

가. 1차원 Rollup

1차원은 GROUP BY 절의 ROLLUP에 하나의 칼럼이 들어간 경우를 이야기한것입니다. 이는 총계가 생성되어 나오는 경우가 되며 가장 많이 사용되는 단순한 형태의 예제입니다

select empno, sum(sal)
from emp
group by rollup(empno);
EMPNO SUM(SAL)  
7369 800  
7499 1600  
7521 1250  
7566 2975  
7654 1250  
7698 2850  
7782 2450  
7788 3000  
7839 5000  
7844 1500  
7876 1100  
7900 950  
7902 3000  
7934 1300  
  29025 –생성값

나. 2차원 ROLLUP

위의 예제에서는 ROLLUP 안에 2개의 칼럼이 들어가 있습니다. 이런경우 DEPTNO별 총계와 전체 총계가 나타난다. 즉 ROLLUP(DEPTNO, EMPNO)에서 가장 안쪽에 있는 칼럼인 DEPTNO별로 총계가 한번 생성되고 전체 총계가 한번 더 생성되는 케이스입니다

select deptno,empno, sum(sal)
from emp
group by rollup(deptno, empno);
DEPTNO EMPNO SUM(SAL)
10 7782 2450
10 7839 5000
10 7934 1300
10   8750
20 7369 800
20 7566 2975
20 7788 1100
20 7876 1100
20 7902 3000
20   8975
30 7900 950
30 7499 1600
30 7521 1250
30 7654 1250
30 7698 2850
30 7844 1500
30   9400
    27125

다. Partial Rollup

부분(Partial) Rollup형태는 group by절의 rollup에서 제외된 칼럼이 앞쪽에 위치하는 경우입니다. 이런경우 제외된 deptno 칼럼d을 기준으로 서브 총계가 한번 생성되고 전체 총계는 나오지 않는 특징이 있습니다. 많이 사용되는 방법이니 잘 기억하길 바라며 응용예제에서 어떻게 사용되는지 살펴보면 쉽게 이해할수 있는 방법입니다

select deptno, empno, sum(sal)
from emp
group by  deptno, rollup(empno);
DEPTNO EMPNO SUM(SAL)
10 7782 2450
10 7839 5000
10 7934 1300
10   8750
20 7369 800
20 7566 2975
20 7788 1100
20 7876 1100
20 7902 3000
20   8975
30 7900 950
30 7499 1600
30 7521 1250
30 7654 1250
30 7698 2850
30 7844 1500
30   9400

라. Grouping On Composite Columns

이 방법은 여러 개의 칼럼이 select절에 위치하는데 오로지 내가 필요한 자료는 전체 총계만 필요한경우 많이 사용되는 방법입니다. rollup안에서 deptno, empno, ename을 ( )로 한번 더 묶어주면 Deptno||empno||ename 형태로 하나의 칼럼으로 인식하게 됩니다. 즉 1차원이 된다는 이야기입니다. 그러므로 전체 총계가 1번만 생성됩니다.

select deptno,empno, ename, sum(sal)
from emp 
group by rollup((deptno,empno,ename));
DEPTNO EMPNO ENAME SUM(SAL)
10 7782 CLARK 2450
10 7839 KING 5000
10 7934 MILLER 1300
20 7369 SMITH 800
20 7566 JONES 2975
20 7788 SCOTT 1100
20 7876 ADAMS 1100
20 7902 FORD 3000
30 7900 JAMES 950
30 7499 ALLEN 1600
30 7521 WARD 1250
30 7654 MARTIN 1250
30 7698 BLAKE 2850
30 7844 TURNER 1500
      27125