2.4 Cube

출처 http://www.gurubee.net/lecture/1846

CUBE operator

CUBE 강좌를 보기 전에 바로 전에 있는 ROLLUP 강좌를 꼭 보기 바란다.

ROLLUP 예제
 
SQL> SELECT b.dname, a.job, SUM(a.sal) sal, 
            COUNT(a.empno) emp_count
     FROM emp a, dept b
     WHERE a.deptno = b.deptno
     GROUP BY ROLLUP(b.dname, a.job);


DNAME      JOB               SAL  EMP_COUNT
---------- ---------- ---------- ----------
ACCOUNTING CLERK            1300          1
ACCOUNTING MANAGER          2450          1
ACCOUNTING PRESIDENT        5000          1
ACCOUNTING                  8750          3  -->  ACCOUNTING 부서의 급여 합계와 전체 사원 수
RESEARCH   ANALYST          6000          2
RESEARCH   CLERK            1900          2
RESEARCH   MANAGER          2975          1
RESEARCH                   10875          5 -->  RESEARCH 부서의 급여 합계와 전체 사원 수
SALES      MANAGER         28500          1
SALES      SALESMAN         4000          3
SALES                      32500          4 -->  SALES부서의 급여 합계와 전체 사원 수
                               52125         12 ->  전체 급여 합계와 전체 사원 수
    

위의 SQL의 결과를 보면 부서별로 각 직업에 해당하는 급여와 사원수를 볼 수 있다.

하지만 부서별로 각 직업의 급여와 사원수, 그리고 또 각 직업별로 급여 합계와 사원수를 보기 위해서는 두개의ROLLUP을 사용해서 SQL문을 작성해야 한다.

 
-- 이렇게 하면 되겠죠..
SQL> SELECT b.dname, a.job, SUM(a.sal) sal, COUNT(a.empno) emp_count
     FROM emp a, dept b
     WHERE a.deptno = b.deptno
     GROUP BY ROLLUP(b.dname, a.job)
     UNION
     SELECT ' ', job, SUM(sal) sal, COUNT(empno) emp_count
     FROM emp
     GROUP BY ROLLUP(job);
 
DNAME      JOB               SAL  EMP_COUNT
---------- ---------- ---------- ----------
ACCOUNTING  CLERK           1300          1
ACCOUNTING  MANAGER         2450          1
ACCOUNTING  PRESIDENT       5000          1
ACCOUNTING                  8750          3
RESEARCH    ANALYST         6000          2
RESEARCH    CLERK           1900          2
RESEARCH    MANAGER         2975          1
RESEARCH                   10875          5
SALES       MANAGER        28500          1
SALES       SALESMAN        4000          3
SALES                      32500          4  --> 요기 까지는 첫 번째 ROLLUP을 이용
             ANALYST         6000           2
            CLERK           3200          3
            MANAGER        33925          3
            PRESIDENT       5000          1
            SALESMAN        4000          3
                           52125         12  --> 요 부분은 두 번째 ROLLUP을 이용
    

CUBE를 사용하면 편하게 하나의 SQL문으로 위의 결과를 얻을 수 있다. 직접 아래 SQL문을 실행시켜 보면 쉽게 이해가 간다.

 
SQL> SELECT b.dname, a.job, SUM(a.sal) sal, COUNT(a.empno) emp_count
     FROM emp a, dept b
     WHERE a.deptno = b.deptno
     GROUP BY CUBE(b.dname, a.job)

DNAME      JOB               SAL  EMP_COUNT
---------- ---------- ---------- ----------
ACCOUNTING  CLERK            1300          1
ACCOUNTING  MANAGER          2450          1
ACCOUNTING  PRESIDENT        5000          1
ACCOUNTING                   8750          3 --> ACCOUNTING 부서의 직업별 급여의 총계와 사원 수.
RESEARCH    ANALYST          6000          2
RESEARCH    CLERK            1900          2
RESEARCH    MANAGER          2975          1
RESEARCH                    10875          5 --> RESEARCH 부서의 직업별 급여의 총계와 사원 수.
SALES       MANAGER         28500          1
SALES       SALESMAN         4000          3
SALES                       32500          4 --> SALES 부서의 직업별 급여 총계와 사원 수.
            ANALYST          6000          2
            CLERK            3200          3
            MANAGER         33925          3
            PRESIDENT        5000          1
            SALESMAN         4000          3   
                            52125         12  --> 직업별로 급여의  총계와 사원 수.

-- CUBE를 어느 경우에 사용 할 수 있는지 이해 되셨죠..
-- CUBE는 Cross-Tab에 대한 Summary를 추출하는데 사용 된다
-- 즉 ROLLUP에 의해 나타 내어지는 Item Total값과 Column Total값을 나타 낼 수 있다.    
    

참고링크

SQL 전문가 가이드 – 제5절 그룹 함수(GROUP FUNCTION)


답글 남기기 0

Your email address will not be published. Required fields are marked *