'DATABASE'에 해당되는 글 18건
- 2008.09.19 rollup cube
############################ ROLLUP and CUBE ############################
## ROLLUP은 GROUP BY 절의 그룹 조건에 따라 전체 행을 그룹화 하고, 각 그룹에 대해 부분합을 구하는 연산자이다.
## CUBE는 ROLLUP에 의한 그룹 결과와 GROUP BY 절에 기술된 조건에 따라 그룹 조합을 만드는 연산자이다.
즉, ROLLUP 연산자를 수행한 결과에 더해 GROUP BY 절에 기술된 조건에 따라 모든 가능한 그룹핑 조합에 대한 결과를 출력한다.
## ROLLUP구문은 GROUP BY절과 같이 사용 되며, GROUP BY절에 의해서 그룹 지어진 집합결과에 대해서
좀 더 상세한 정보를 반환하는 기능을 수행합니다.
## SELECT절에 ROLLUP을 사용함으로써 보통의 select된 데이터와 그 데이터의 총계를 구할 수 있습니다.
rollup(a,b,c) = ( (a,b,c), (a,b), (a), ( ) )
cube(a,b,c) = ( (a,b,c), (a,b), (a,c), (b,c), (a), (b), (c), ( ) )
즉, rollup은 n+1개의 grouping이 되고
cube는 2의 n제곱개의 grouping이 나온다.
【형식】
SELECT 컬럼명, 그룹함수(컬럼명)
FROM 테이블명
WHERE 조건
GROUP BY [ROLLUP | CUBE]그룹핑하고자하는 컬럼명,...
HAVING 그룹조건
ORDER BY 컬럼명 또는 위치번호
-- 실습 1
SQL> select department_id, job_id, sum(salary)
2 from emp
3 where department_id <60
4* group by rollup(department_id, job_id)
DEPARTMENT_ID JOB_ID SUM(SALARY)
------------- ---------- -----------
10 AD_ASST 4400 <~ depatment_id+job_id
10 4400 <~ department_id
20 MK_MAN 13000
20 MK_REP 6000
20 19000
30 PU_MAN 11000
30 PU_CLERK 13900
30 24900
40 HR_REP 6500
40 6500
50 ST_MAN 36400
50 SH_CLERK 64300
50 ST_CLERK 55700
50 156400
211200 <~ total
-- 실습2
SQL> select department_id, job_id, sum(salary)
2 from emp
3 where department_id <60
4* group by cube(department_id, job_id)
DEPARTMENT_ID JOB_ID SUM(SALARY)
------------- ---------- -----------
211200 <~ total
HR_REP 6500 <~ job_id
MK_MAN 13000
MK_REP 6000
PU_MAN 11000
ST_MAN 36400
AD_ASST 4400
PU_CLERK 13900
SH_CLERK 64300
ST_CLERK 55700
10 4400 <~ department_id
10 AD_ASST 4400 <~ department_id+job_id
20 19000
20 MK_MAN 13000
20 MK_REP 6000
30 24900
30 PU_MAN 11000
30 PU_CLERK 13900
40 6500
40 HR_REP 6500
50 156400
50 ST_MAN 36400
50 SH_CLERK 64300
50 ST_CLERK 55700
-- 실습3(grouping 함수를 이용)
SQL> select department_id DEPTID, job_id JOB, sum(salary),
2 grouping(department_id) GRP_DEPT,
3 grouping(job_id) GRP_JOB
4 from emp
5 where department_id<50
6 group by rollup(department_id,job_id);
DEPTID JOB SUM(SALARY) GRP_DEPT GRP_JOB
---------- ---------- ----------- ---------- ----------
10 AD_ASST 4400 0 0 <~ department_id+job_id
10 4400 0 1 <~ department_id
20 MK_MAN 13000 0 0
20 MK_REP 6000 0 0
20 19000 0 1
30 PU_MAN 11000 0 0
30 PU_CLERK 13900 0 0
30 24900 0 1
40 HR_REP 6500 0 0
40 6500 0 1
54800 1 1 <~ total
** group으로 사용되면 0으로, 사용되지 않았다면 1로 표시해준다.
SQL> select decode(grouping(d.department_name),1,'TOTAL',d.department_name) DEPT_NAME,
2 decode(grouping(e.job_id),1,'TOTAL',e.job_id) JOB_ID, sum(e.salary) SAL,
3 count(e.employee_id) EMP_COUNT,
4 grouping(d.department_name) DNAME_NO, grouping(e.job_id) JOB_NO
5 from emp e, dept d
6 where e.department_id=e.department_id
7* group by rollup(d.department_name, e.job_id)
DEPT_NAME JOB_ID SAL EMP_COUNT DNAME_NO JOB_NO
------------------------------ ---------- ---------- ---------- ---------- ----------
IT AD_VP 34000 2 0 0
IT AC_MGR 12000 1 0 0
IT FI_MGR 12000 1 0 0
.
.
IT TOTAL 684400 106 0 1
Finance AD_VP 34000 2 0 0
Finance AC_MGR 12000 1 0 0
Finance FI_MGR 12000 1 0 0
Finance HR_REP 6500 1 0 0
.
.
Finance TOTAL 684400 106 0 1
.
.
TOTAL TOTAL 18478800 2862 1 1
-- 실습4 (grouping set을 이용하여 내마음대로 group을 지정)
SQL> l
1 select department_id, job_id, manager_id, avg(salary)
2 from emp
3 group by GROUPING SETS
4* ( (department_id,job_id), (job_id,manager_id))
SQL> /
DEPARTMENT_ID JOB_ID MANAGER_ID AVG(SALARY) [출처] Rollup and Cube|작성자 알폰즈
------------- ---------- ---------- -----------
AC_MGR 101 12000 <~ job_id+manager_id
SH_CLERK 122 3200
SH_CLERK 124 2825
MK_MAN 100 13000
.
.
.
110 AC_ACCOUNT 8300 <~ department_id+job_id
90 AD_VP 17000
50 ST_CLERK 2785
80 SA_REP 8396.55172
110 AC_MGR 12000
.
.
.
'DATABASE > ORACLE' 카테고리의 다른 글
엑셀(.xls) 데이터 가져오기 (0) | 2009.02.16 |
---|---|
Oracle 9i 이상에서 관리자 계정을 잊어먹었을 때... (0) | 2008.12.11 |
[PL/SQL] (0) | 2008.09.24 |
sql (0) | 2008.09.02 |
오라클 함수 (0) | 2008.09.01 |