http://huzii.egloos.com/viewer/3638265
Group by, Rollup, Cube의 차이점
네이버 어딘가에서 무단으로 훔쳐왔음.. -_-;
네이버 검색 창에서 rollup으로 검색 후 선정.
편집이 좀 조잡하지만...
내용은 만점.
죄송하고 감사합니다.
| ||||||||
|
◈ CUBE operator
※ CUBE강좌를 보시기 전에 바로 위에 있는 ROLLUP강좌를 꼭 봐주세요..
ROLLUP 강좌예제 중에서 아래 SQL문 예제를 가지고 CUBE강좌를 진행 하려고 합니다.
==================== ROLLUP 강좌의 예제입니다. =======================
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문을 작성해야 합니다.
아래와 같이 되겠죠..
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 Operator를 사용하면 편하게 하나의 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 Operator는 Cross-Tab에 대한 Summary를 추출하는데 사용 됩니다
즉 ROLLUP에 의해 나타내어지는 Item Total값과 Column Total값을 나타 낼 수 있습니다.
너무 어렵게 설명했나요... 응용해서 테스트 해보세요..
◈ GROUPING() 함수
GROUPING Function은 ROLLUP, CUBE Operator에 모두 사용할 수 있습니다.
GROUPING Function는 해당 Row가 GROUP BY에 의해서 산출된 Row인 경우에는 0을 반환하고,
ROLLUP이나 CUBE에 의해서 산출된 Row인 경우에는 1을 반환하게 됩니다.
따라서 해당 Row가 결과집합에 의해 산출된 Data인지,
ROLLUP이나 CUBE에 의해서 산출된 Data인지를 알 수 있도록 지원하는 함수입니다.
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)
DNAME JOB SAL EMP_COUNT D S
---------- ---------- ------- ---------- ---- ----
ACCOUNTING CLERK 1300 1 0 0
ACCOUNTING MANAGER 2450 1 0 0
ACCOUNTING PRESIDENT 5000 1 0 0
ACCOUNTING 8750 3 0 1
RESEARCH ANALYST 6000 2 0 0
RESEARCH CLERK 1900 2 0 0
RESEARCH MANAGER 2975 1 0 0
RESEARCH 10875 5 0 1
SALES MANAGER 28500 1 0 0
SALES SALESMAN 4000 3 0 0
SALES 32500 4 0 1
ANALYST 6000 2 1 0
CLERK 3200 3 1 0
MANAGER 33925 3 1 0
PRESIDENT 5000 1 1 0
SALESMAN 4000 3 1 0
52125 12 1 1
'Database' 카테고리의 다른 글
[ORACLE] 자동 증가 컬럼(Sequence) 사용하기 (0) | 2015.12.21 |
---|---|
기존 테이블에 대한 ER Diagram 자동 생성 (0) | 2015.02.25 |
How to Back Up and Restore a MySQL Database (0) | 2014.07.11 |
Oracle mysql comparison (0) | 2014.03.29 |
오라클 shutdown 시 'cannot shutdown - file 1 has on line backup set'에러 발생시에 (0) | 2014.03.21 |