<형식>
SELECT 컬럼명,그룹함수(컬럼명), GROUPING(컬럼명)
FROM 테이블명
WHERE 조건
GROUP BY [ROLLUP | CUBE] 그룹핑하고자하는 컬럼명, ...
[GROUPING SETS (컬럼명,컬럼명, ...), ...]
HAVING 그룹조건
ORDER BY 컬럼명 또는 위치번호
ROLLUP과 CUBE는 매우 유사하다. 이들은 우리가 GROUP BY한 결과에 대해 여러가지 형태의 소계를 쉽게 구해준다.
ROLLUP은 GROUP BY 절의 그룹 조건에 따라 전체 행을 그룹화 하고, 각 그룹에 대해 부분합을 구하는 연산자이다.
CUBE는 ROLLUP에 의한 그룹 결과와 GROUP BY 절에 기술된 조건에 따라 그룹 조합을 만드는 연산자이다.
즉, ROLLUP 연산자를 수행한 결과에 더해 GROUP BY 절에 기술된 조건에 따라 모든 가능한 그룹핑 조합에 대한 결과를 출력한다.
- ROLLUP과 CUBE는 GROUP BY 절 뒤에 기술한 컬럼 개수에 따라 출력되는 결과 셋이 달라진다.
- GROUP BY 뒤에 기술한 컬럼이 2개일 경우 ROLLUP은 n+1에서 3개의 그룹별 결과가 출력되고, CUBE는 2*n에서 2*2=4개의 결과 셋이 출력된다.
ROLLUP 예제>
select deptno, job, sum(sal), grouping(deptno), grouping(job)
from emp
group by rollup(deptno, job)
DEPTNO | JOB | SUM(SAL) | GROUPING(DEPTNO) | GROUPING(JOB) |
10 | CLERK | 920 | 0 | 0 |
10 | MANAGER | 2572.5 | 0 | 0 |
10 | PRESIDENT | 5500 | 0 | 0 |
10 | 8992.5 | 0 | 1 | |
20 | ANALYST | 3450 | 0 | 0 |
20 | MANAGER | 3123.75 | 0 | 0 |
20 | 6573.75 | 0 | 1 | |
30 | SALESMAN | 2912.5 | 0 | 0 |
30 | 2912.5 | 0 | 1 | |
18478.75 | 1 | 1 |
CUBE 예제>
select deptno, job, sum(sal), grouping(deptno), grouping(job)
from emp
group by cube(deptno, job)
DEPTNO | JOB | SUM(SAL) | GROUPING(DEPTNO) | GROUPING(JOB) |
18478.75 | 1 | 1 | ||
ANALYST | 3450 | 1 | 0 | |
CLERK | 920 | 1 | 0 | |
MANAGER | 5696.25 | 1 | 0 | |
PRESIDENT | 5500 | 1 | 0 | |
SALESMAN | 2912.5 | 1 | 0 | |
10 | 8992.5 | 0 | 1 | |
10 | CLERK | 920 | 0 | 0 |
10 | MANAGER | 2572.5 | 0 | 0 |
10 | PRESIDENT | 5500 | 0 | 0 |
20 | 6573.75 | 0 | 1 | |
20 | ANALYST | 3450 | 0 | 0 |
20 | MANAGER | 3123.75 | 0 | 0 |
30 | 2912.5 | 0 | 1 | |
30 | SALESMAN | 2912.5 | 0 | 0 |
GROUPING함수는 ROLLUP이나 CUBE 연산자와 함께 사용하여 GROUPING 함수에 기술된 컬럼이 그룹핑 시 즉, ROLLUP이나 CUBE 연산시 사용이 되었는지를 보여 주는 함수이다.
특별히 연산 기능은 없으며 ROLLUP이나 CUBE 연산 후 출력된 결과에 대한 사용자의 이해를 높이기 위해 사용된다.
즉, GROUPING 함수를 이용할 경우 출력되는 결과값 중 NULL값이 있다면 이 NULL값이 ROLLUP이나 CUBE 연산의 결과로 생성된 것인지, 원래 테이블상에 NULL값으로 저장된 것인지를 확인할 수 있다.
GROUPING Function은 ROLLUP, CUBE Operator에 모두 사용할 수 있습니다.
GROUPING Function는 해당 Row가 GROUP BY에 의해서 산출된 Row인 경우에는 0을 반환하고,
ROLLUP이나 CUBE에 의해서 산출된 Row인 경우에는 1을 반환하게 됩니다.
따라서 해당 Row가 결과집합에 의해 산출된 Data인지, ROLLUP이나 CUBE에 의해서 산출된 Data인지를 알 수 있도록 지원하는 함수입니다.
- GROUPING 함수는 인수 로 하나의 값만을 가질 수 있다.
- GROUPING 함수에 사용된 인수는 GROUP BY 절에 기술된 값중에 하나와 반드시 일치되어야 한다.
GROUPING SETS 함수는 GROUP BY 절에서 그룹 조건을 여러 개 지정할 수 있는 함수이다.
GROUPING SETS 함수의 결과는 각 그룹 조건에 대해 별도로 GROUP BY한 결과를 UNION ALL한 결과와 동일하다.
GROUPING SETS 함수는 하나의 SQL문에 의해 여러 개의 그룹 조건을 한꺼번에 지정하여 복잡한 그룹 처리 과정을 단순하게 구성할 수 있다.
GROUPING SETS 함수는 Group by의 확장된 형태로 하나의 쿼리문에서 원하는 그룹핑 조건을 여러 개 기술할 수 있으며,
GROUPING SETS 함수 사용이 불가능한 이전 버전에서 복잡한 union all 연산자를 사용하여 기술하던 것을 간단하게 한 문장 안에서 해결할 수 있어 검색시 효율성이 증대 된다.
다시 말해서, GROUPING SETS 함수를 사용하면, group by ... union all을 사용한 것보다 SQL 문이 간단해지고 또한 실행시 성능이 빨라진다.
GROUPING SETS 예제>
select deptno, job, ename, sum(sal), grouping(deptno), grouping(job), grouping(ename)
from emp
group by grouping sets((deptno, job), (deptno, ename))
DEPTNO
JOB
ENAME
SUM(SAL)
GROUPING(DEPTNO)
GROUPING(JOB)
GROUPING(ENAME)
10
CLERK
920
0
0
1
10
MANAGER
2572.5
0
0
1
10
PRESIDENT
5500
0
0
1
20
ANALYST
3450
0
0
1
20
MANAGER
3123.75
0
0
1
30
SALESMAN
2912.5
0
0
1
10
CLARK
2572.5
0
1
0
10
KING
5500
0
1
0
10
MILLER
920
0
1
0
20
CHAN
3450
0
1
0
20
JONES
3123.75
0
1
0
30
ALLEN
1600
0
1
0
30
MARTIN
1312.5
0
1
0