그룹 함수 (ROLLUP , CUBE , GROUPING SETS)
1. ROLLUP
A컬럼의 서로 다른 원소의 개수가 M개이고
B컬럼의 서로 다른 원소의 개수가 N개라고 가정하자
SELECT A , B , SUM(C)
FROM 테이블_ABC
GROUP BY ROLLUP( A , B )
A(1)와 B(1)에 관한 C의 합이 나오고
A(1)와 B(2)에 관한 C의 합이 나오고
...
A(1)와 B(N)에 관한 C의 합이 나오고
해당 A(1) 전체에 관한 C의 합이 나오고
A(2)와 B(1)에 관한 C의 합이 나오고
A(2)와 B(2)에 관한 C의 합이 나오고
...
A(2)와 B(N)에 관한 C의 합이 나오고
해당 A(2) 전체에 관한 C의 합이 나오고
A(M)와 B(1)에 관한 C의 합이 나오고
A(M)와 B(2)에 관한 C의 합이 나오고
...
A(M)와 B(N)에 관한 C의 합이 나오고
해당 A(M) 전체에 관한 C의 합이 나오고
마지막으로 테이블 전체에 관한 C의 합이 나온다.
ex)
SELECT deptno, job, sum(sal)
FROM emp
GROUP BY ROLLUP( deptno , job );
DEPTNO |
JOB |
SUM(SAL) |
10 |
CLERK |
1300 |
10 |
MANAGER |
2450 |
10 |
PRESIDENT |
5000 |
10 |
|
8750 |
20 |
CLERK |
1900 |
20 |
MANAGER |
6000 |
20 |
PRESIDENT |
2975 |
20 |
|
10875 |
30 |
CLERK |
950 |
30 |
MANAGER |
2850 |
30 |
PRESIDENT |
5600 |
30 |
|
9400 |
|
|
29025 |
집계 결과 |
1 |
deptno, job |
부서 번호별 |
2 |
deptno |
부서 번호별 |
|
3 |
() |
전체 토탈 월급 |
<참고>
GROUP BY ROLLUP( deptno , job ) 는 GROUP BY GROUPING SETS( (deptno , job) , deptno , () ) 와 같다.
2. CUBE
A컬럼의 서로 다른 원소의 개수가 M개이고
B컬럼의 서로 다른 원소의 개수가 N개라고 가정하자
SELECT A , B , SUM(C)
FROM 테이블_ABC
GROUP BY CUBE( A , B )
<위의 sql의 결과>
테이블 전체에 관한 C의 합이 나오고
[B(1) 관한 C의 합이 나오고
B(2) 관한 C의 합이 나오고
...
B(N) 관한 C의 합이 나오고]
A(1)에 관한 C의 합이 나오고
[A(1)과 B(1)에 관한 C의 합이 나오고
A(1)과 B(2)에 관한 C의 합이 나오고
...
A(1)과 B(N)에 관한 C의 합이 나오고]
A(2)에 관한 C의 합이 나오고
[A(2)과 B(1)에 관한 C의 합이 나오고
A(2)과 B(2)에 관한 C의 합이 나오고
...
A(2)과 B(N)에 관한 C의 합이 나오고]
...
A(M)에 관한 C의 합이 나오고
[A(M)과 B(1)에 관한 C의 합이 나오고
A(M)과 B(2)에 관한 C의 합이 나오고
...
A(M)과 B(N)에 관한 C의 합이 나온다.]
ex)
SELECT deptno, job, sum(sal)
FROM emp
GROUP BY CUBE( deptno , job );
DEPTNO |
JOB |
SUM(SAL) |
|
|
29025 |
|
CLERK |
4150 |
|
ANALYST |
6000 |
|
MANAGER |
8275 |
|
SALESMAN |
5600 |
|
PRESIDENT |
5000 |
10 |
|
8750 |
10 |
CLERK |
1300 |
10 |
MANAGER |
2450 |
10 |
PRESIDENT |
5000 |
20 |
|
10875 |
20 |
CLERK |
1900 |
20 |
ANALYST |
6000 |
20 |
MANAGER |
2975 |
30 |
|
9400 |
30 |
CLERK |
950 |
30 |
MANAGER |
2850 |
30 |
SALESMAN |
5600 |
집계 결과
|
1 |
() |
전체 토탈 월급 |
2 |
job |
직업별 |
|
3 |
deptno |
부서 번호별 |
|
4 |
deptno, job |
부서 번호별 |
GROUP BY CUBE( deptno , job ) 는 GROUP BY GROUPING SETS( () , job , deptno, (deptno , job) ) 와 같다.
3. GROUPING SETS
GROUPING SETS에는 집계하고 싶은 컬럼들을 기술하면 그대로 출력된다.
GROUPING SETS 괄호 안에 다음과 같이 집계하고 싶은 컬럼명을 기술하면 기술한대로 결과를 출력해주면 된다.
GROUPING SETS |
출력 결과 |
GROUPING SETS((deptno), (job), ()) |
부서 번호별 집계, 직업별 집계, 전체 집계 |
GROUPING SETS((deptno), (job)) |
부서 번호별 집계, 직업별 집계 |
GROUPING SETS((deptno, job), ()) |
부서 번호와 직업별 집계, 전체 집계 |
GROUPING SETS((deptno, job)) |
부서 번호와 직업별 집계 |
4. GROUPING
GROUPING(colum)은 colum이 null일때 0을 반환하고 null이 아니면 1을 반환한다.
주로 SELECT 절에서 쓰인다.