Oracle Advanced SQL 강좌
Cube 16 18 68,588

by 김정식 CUBE ROLLUP [2003.11.19]


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값을 나타 낼 수 있다.    
    

참고링크

- 강좌 URL : http://www.gurubee.net/lecture/1846

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 초보자 [2005.03.16 11:02:45]
grouping()이라는 함수 정말 좋은 함수군요. 시종 일관 고민했던 문제를 이 함수가 쏵 해결해주네요^^.. 정보 너무나 고마워요 ^^

by smile [2005.11.09 20:19:47]
퍼갑니다. ^^

by 초보자 [2006.06.02 11:44:24]
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)
order by b.dname --> 이거를 추가해야 위 그림의 결과와 같아짐.
order by 가 추가 되지 않음 합계와 소계가 맨 위에 있겠죠 ^^



by 초보자 [2006.06.02 13:03:09]
- Grouping에서와 마찬가지로 -
SELECT b.dname, a.job, SUM(a.sal) sal, COUNT(a.empno) emp_count,
GROUPING(b.dname) "D", GROUPING(a.job) "S"
FROM emp a, dept b
WHERE a.deptno = b.deptno
GROUP BY CUBE(b.dname, a.job)
order by b.dname --> 이거를 추가해야 위 그림의 결과와 같아짐.


by 꾸~~욱! [2006.07.21 01:58:41]
초보자가 아닌듯..!

by 오라 천재 [2006.08.24 10:31:50]
초보자 맞아여..ㅋㅋ

by 똘마니 [2007.02.07 11:20:07]
자동 소트 되는데....흠...

by 김현화 [2007.04.02 17:58:54]
GROUPING SETS 절에 대한 설명이 없네요.. 설명 추가 좀 해주세요.

by 허접 [2007.09.04 19:25:34]
GROUPING SETS는 어떤 한 컬럼에 대해서 소계를 낼 때 사용됩니다.
예를들어서 A, B, C, D, E라는 컬럼이 있고, A는 판매사, B는 차종, C는
오토인지 수동인지, D는 CC, E가 가격이라고 가정합시다.
A는 현대, 기아, 쌍용, 대우 등이 되겠죠. A에서 말한 기업들에서 나오는
차종은 수십가지 입니다. 기업별로 생산되는 차들의 값들에 대한 소계를
내고자 합니다. ROLLUP이나 CUBE를 쓰게 된다면 UNION을 써서 진짜 코드
지저분하게 쿼리 짜야하거든요. 하지만 GROUPING SETS를 쓰면 간단하게
짤수 있게 됩니다.
SELECT A, B, C, D, SUM(E) AS E
FROM TABLE1 A
, TABLE2 B
WHERE 어쩌고 저쩌고 조인조건 및 조회조건 들어가겠죠
GROUP BY GROUPING SETS((A, B, C, D, E), (A))
을 하게 되면 판매사 별로 각종 차들의 값을 소계낼 수 있게 되는 것입니다.
이해 가시는지 ^^

by 허접 [2007.09.04 19:27:34]
어떤 사람들은 걍 group by 걸어서 할 수 있지 않느냐 라고 생각하시는 분들
정말 많으실텐데 다시 한번 말하지만 only 컬럼 A의 값에 따른 소계를 구하는
겁니다.. 나머지 컬럼 B, C, D에 대해서 GROUP BY를 걸면 절대 안되는 것이지요.
UNDERSTAND?? ^^;;

by 된장 [2008.05.14 08:35:03]
잘 봤습니다..감사.

by 하영호 [2008.09.11 10:14:55]
grouping sets 는 오라클버전에 상관없이 사용가능한건가요?

by 하루살이 [2009.08.05 16:32:59]
cube나 grouping이나 이전에 있엇던 rollup 같은 함수

많이 쓰이나요? 그냥 궁금해서 ㅎㅎ

by 양한마리 [2010.02.03 10:32:27]
좋은 정보 감사합니다.^ ^

by 왕초보 [2011.08.12 18:09:30]
좋은 정보 알아갑니다~~

by 쫑 [2012.02.08 09:58:55]
혹시 group_id() 에 대해 설명좀 ㅜㅜ

by 까망소 [2012.12.21 15:19:16]

cube는 멋진 함수이군요!!!
분석자료 리포트 할 때 쿼리가 한결 간결해 질 수 있겠습니다. ㅋ

by 정존 [2013.07.12 11:21:18]
좋은 정보 감사합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입