▪ ROLLUP 또는 CUBE를 GROUP BY에 사용하여 상호 참조열에 따라 상위 집계 행을 산출한다.
▪ ROLLUP 그룹화는 정규 그룹화 행과 하위 총계값을 포함하는 결과 집합을 산출한다.
▪ CUBE그룹화는 ROLLUP의 결과 행 및 교차 도표화 행을 포함하는 결과 집합을 산출한다.
▪ ROLLUP 은 GROUP BY의 확장 기능이다.
▪ ROLLUP 연산을 사용하면 하위 총계와 같은 누적 집계를 산출할 수 있다.
▪ ROLLUP에 지정된 Grouping Column의 List는 SubTotal을 생성하기 위해 사용된다.
▪ Grouping Column의 개수가 N 이라면 N+1 Level의 SubTotal이 생성된다.
▪ 인자의 순서에 따라 결과가 다르게 조회되므로 유의한다.
SELECT [column], group_function(column)…
FROM table
[WHERE condition]GROUP BY [ROLLUP] group_by_expression]
[HAVING having_expression][ORDER BY column] ;
SELECT D.DNAME, E.JOB, COUNT(*) AS EMP_CNT, SUM(E.SAL) AS SAL_SUM
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY D.DNAME, E.JOB;
SELECT D.DNAME, E.JOB, COUNT(*) AS EMP_CNT, SUM(E.SAL) AS SAL_SUM
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY D.DNAME, E.JOB
ORDER BY D.DNAME, E.JOB;
SELECT D.DNAME, E.JOB, COUNT(*) AS EMP_CNT, SUM(E.SAL) AS SAL_SUM
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY ROLLUP(D.DNAME, E.JOB);
SELECT D.DNAME, E.JOB, COUNT(*) AS EMP_CNT, SUM(E.SAL) AS SAL_SUM
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY ROLLUP(E.JOB, D.DNAME); --ROLLUP의 인자 순서를 바꾸면 위의 쿼리와 결과가 다름. 확인!
▪ CUBE 은 GROUP BY의 확장 기능이다.
▪ CUBE 연산을 사용하면 하나의 SELECT문으로 CROSS TABULATION 값을 산출할 수 있다.
▪ Grouping 컬럼이 가질 수 있는 모든 경우에 대하여 SubTotal을 생성해야 하는 경우에 사용하나,
RollUp에 비해 시스템에 많은 부담을 주므로 사용에 주의해야 한다.
▪ ROLLUP과 다르게 인자의 순서는 상관이 없다.
SELECT [column], group_function(column)…
FROM table
[WHERE condition]GROUP BY [CUBE] group_by_expression]
[HAVING having_expression][ORDER BY column] ;
SELECT D.DNAME, E.JOB, COUNT(*) AS EMP_CNT, SUM(E.SAL) AS SAL_SUM
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY CUBE(D.DNAME, E.JOB);
▪ GROUPING 함수는 ROLLUP ,CUBE 연산자와 함께 사용한다.
▪ GROUPING 함수를 사용하면 행에서 하위 총계를 형성한 그룹을 찾을 수 있다.
▪ GROUPING함수를 사용하면 ROLLUP,CUBE를 통해 만들어진 NULL값과 저장된 NULL값을
구별할 수 있다
▪ GROUPING함수는 0 또는 1을 반환한다.
(ROLLUP 이나 CUBE 에 소계가 계산된 결과에는 Grouping(expr) = 1 이 표시된다.
그 외의 결과에는 Grouping(expr) = 0 이 표시된다.)
SELECT deptno, job, SUM(sal), GROUPING(deptno) , GROUPING(job)
FROM EMP
GROUP BY ROLLUP (deptno, job);
SELECT deptno, job, SUM(sal), GROUPING(deptno) , GROUPING(job)
FROM EMP
GROUP BY CUBE (deptno, job);
SELECT D.DNAME, GROUPING(D.DNAME) AS DEPT_GRP, E.JOB, GROUPING(E.JOB) AS JOB_GRP,
COUNT(*) AS EMP_CNT, SUM(E.SAL) AS SAL_SUM
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY ROLLUP(D.DNAME, E.JOB)
ORDER BY D.DNAME, E.JOB;
SELECT CASE GROUPING(D.DNAME) WHEN 1 THEN 'All Departments' ELSE D.DNAME END AS DNAME,
CASE GROUPING(E.JOB) WHEN 1 THEN 'All Jobs' ELSE E.JOB END AS JOB,
COUNT(*) AS EMP_CNT, SUM(E.SAL) AS SAL_SUM
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY ROLLUP(D.DNAME, E.JOB)
ORDER BY D.DNAME, E.JOB;
SELECT CASE GROUPING(D.DNAME) WHEN 1 THEN 'All Departments' ELSE D.DNAME END AS DNAME,
CASE GROUPING(E.JOB) WHEN 1 THEN 'All Jobs' ELSE E.JOB END AS JOB,
COUNT(*) AS EMP_CNT, SUM(E.SAL) AS SAL_SUM
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY D.DNAME, ROLLUP(E.JOB)
ORDER BY D.DNAME, E.JOB;
SELECT DEPTNO, JOB, SUM(SAL), GROUPING(DEPTNO) , GROUPING(JOB)
FROM EMP
GROUP BY CUBE (DEPTNO, JOB);
▪ GROUPING SETS 은 GROUP BY의 확장 기능이다.
▪ GROUPING SETS을 사용하면 같은 질의에서 여러 그룹화를 정의할 수 있다.
▪GROUPING SETS 절에 지정된 모든 그룹화를 계산하고 UNION ALL 연산을 통해 각 그룹화의 결과를 결합한다.