◈ ROLLUP operator
- ROLLUP구문은 GROUP BY절과 같이 사용 되며, GROUP BY절에 의해서 그룹 지어진
집합결과에 대해서 좀 더 상세한 정보를 반환하는 기능을 수행합니다.
- SELECT절에 ROLLUP을 사용함으로써 보통의 select된 데이터와 그 데이터의
총계를 구할 수 있습니다.
※ 우선 아주 간단한 예제부터 살펴 보겠습니다.
(scott유저의 emp테이블을 가지고 테스트 했습니다.)
-- Group By를 사용해서 직업별로 급여 합계를 구하는 예제 입니다.
SELECT job, SUM(sal)
FROM emp
GROUP BY job
JOB SUM(SAL)
---------- ----------
ANALYST 600
CLERK 3200
MANAGER 33925
PRESIDENT 5000
SALESMAN 4000
-- 아래 SQL문은 위의 예제에 ROLLUP구문을 사용해서 직업별로 급여 합계를 구하고
총계를 구하는 예제 입니다.
SELECT job, SUM(sal)
FROM emp
GROUP BY ROLLUP(job)
JOB SUM(SAL
---------- ----------
ANALYST 6000
CLERK 3200
MANAGER 33925
PRESIDENT 5000
SALESMAN 4000
52125 --> 급여 합계에 대한 총계가 추가 되었습니다.
우선 간단하게 ROLLUP Operator의 예제를 살펴보았습니다.
조금더 복잡한(?) 예제를 하나더 해보면은요..
-- 부서의 직업별로 인원수와 급여 합계를 구하는 예제를 하나더 해보겠습니다.
-- 일반적인 Group By절을 사용해서 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 b.dname, a.job
DNAME JOB SAL EMP_COUNT
---------- ---------- ---------- ----------
ACCOUNTING CLERK 1300 1
ACCOUNTING MANAGER 2450 1
ACCOUNTING PRESIDENT 5000 1
RESEARCH ANALYST 6000 2
RESEARCH CLERK 1900 2
RESEARCH MANAGER 2975 1
SALES MANAGER 28500 1
SALES SALESMAN 4000 3
-- 결과를 보면은요.. 부서별로 인원이 몇명이고, 또 급여합계가 얼마가 되는지 한눈에 보이지 않죠...
일일이 부서에 해당하는 직업별 급여와 사원수를 일일이 더해야 되죠..
-- 이런 경우 ROLLUP Operator를 적용해서 구현을 하면은 부서별 급여합계와 사원 총수를
쉽게 볼 수 있습니다...
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 -> 전체 급여 합계와 전체 사원수
위와 같이 ROLLUP Operator을 일반적인 누적에 대한 총계를 구할때 사용하면 아주 편리하게
사용 할 수 있습니다.
◈ 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 |
출처 : http://egloos.zum.com/huzii/v/3638265
'IT > 오라클' 카테고리의 다른 글
MERGE INTO (0) | 2020.02.18 |
---|---|
[ORACLE] 테이블과 데이터 복사하기 (테이블 백업) (0) | 2016.06.17 |
[ORACLE] Group by (0) | 2016.06.14 |
[ORACLE]무결성 제약조건이 위배되었습니다. (0) | 2016.03.21 |
[ORACLE] SYNONYM(동의어) (0) | 2016.03.17 |