테이블 전체 행을 하나 이상의 컬럼을 기준으로 컬럼 값에 따라 그룹화하여 그룹별로 결과를 출력하는 함수
소계 및 총계 등을 구하기 위해서 그룹 함수를 사용한다면, 단일 DML만으로도 원하는 작업을 할 수 있다.
✔ 지정된 컬럼의 소계 및 총계를 구하기 위해 사용
✔ 지정 컬럼의 수보다 하나 더 큰 레벨만큼의 중간집계 값이 생성된다.
✔ 지정 컬럼은 계층별로 구성되어 순서가 바뀌면 수행 결과가 바뀌기 때문에 유의해서 사용해야 한다.
✔ 컬럼 순서에 따라 결과가 다르다
✔ 집합의 소계, 총계 계산
✔ 가능한 모든 결합 계산
✔ 내부적으로 대상 컬럼의 순서를 변경하여 또 한번의 쿼리를 수행
✔ 다른 그룹 함수보다 시스템에 대한 부하가 크다
✔ 인자로 주어진 컬럼의 결합 가능한 모든 조합에 대해서 집계를 수행
✔ 다차원 집계
✔ 합계가 계산되면 1
✔ 합계가 아니면 0
✔ 다른 집계 함수가 없어도 사용이 가능
✔ 실무적으로 CASE문과 함께 자주 쓰임
✔ SELECT문과 HAVING문에서 사용 가능
✔ GROUP BY 절과 함께 사용
✔ 컬럼 순서와 관계 없음
✔ 컬럼 순서가 달라도 결과가 같음
✔ 내부적으로 대상 컬럼의 순서를 변경하여 또 한번의 쿼리를 수행
✔ 집계 대상 컬럼에 대한 소계를 구할 수 있는 그룹 함수
✔ ROLLUP과 달리 컬럼간 순서와 무관한 결과를 얻을 수 있다.
✔ 다양한 소계 집합을 만들 수 있다.
아래의 테이블을 이용해서 테스트 진행
SELECT JOB, DEPTNO, SUM(SAL)
FROM EMP
GROUP BY ROLLUP(JOB, DEPTNO);
JOB별 소계와 총계가 나오고
가장 아래에 총 합계가 나오는 모습을 볼 수 있다.
SELECT JOB, DEPTNO, SUM(SAL)
FROM EMP
GROUP BY CUBE(JOB, DEPTNO);
ROLLUP과 반대로 가장 위에 줄에 나오는 것이 총 합계 이다
밑에 줄 부터는 DEPTNO인 10, 20, 30별로 각 SAL 총계를 보여주고 있다.
마지막으로 JOB별로 총합을 나타내고 있다.
SELECT JOB, DEPTNO, SUM(SAL)
FROM EMP
GROUP BY GROUPING SETS( (DEPTNO), (JOB), (JOB, DEPTNO), () );
CUBE와 똑같은 결과를 내기 위해서 조금 더 상세한 구문이 필요한것을 확인할 수 있다.
SELECT JOB, DEPTNO, SUM(SAL), GROUPING(JOB), GROUPING(DEPTNO)
FROM EMP
GROUP BY ROLLUP(JOB, DEPTNO);
ROLLUP의 결과와 굉장히 비슷하지만
우측의 0 과 1로 된 합계가 계산되면 1을 나타내고
아닐 경우 0을 반환하는 컬럼의 여부가 다르다