ROLLUP
ROLLUP의 개념
- 일반 GROUP BY는 지정한 컬럼 조합 하나로만 그룹화함
- 부서별 합계와 함께 전체 총계도 한 번에 보고 싶을 때가 있음
- 일반 GROUP BY로는 별도의 SELECT를 UNION ALL로 붙여야함
- ROLLUP은 GROUP BY의 확장 구문으로 소계와 총계를 한 번에 만듦
- ROLLUP은 앞 컬럼부터 차례로 묶음을 줄여가며 계층적 소계를 생성
- 소계·총계 행에서 그룹화에 쓰이지 않은 컬럼은 NULL로 채워짐
GROUP BY ROLLUP(컬럼1, 컬럼2,...)
| 구문 | 생성하는 그룹 |
|---|
| ROLLUP(A) | A별 그룹, 전체 총계 |
| ROLLUP(A,B) | (A,B)별, A별 소계, 전체 총계 |
| ROLLUP(A,B,C) | (A,B,C)별, (A,B)별, A별, 전체 총계 |
부분 ROLLUP과 복합 컬럼
- ROLLUP은 GROUP BY절에서 일반 컬럼과 함께 쓸 수 있음
- ROLLUP 밖의 컬럼은 항상 그룹화 기준으로 고정
- 고정된 컬럼에 대해서는 소계·총계가 만들어지지 않음
- 두 컬럼을 괄호로 묶으면 ROLLUP은 이를 한 컬럼처럼 취급
- 묶음 안의 부분 조합과 소계는 생성되지 않음
CUBE / GROUPING SETS
CUBE
- CUBE는 지정한 컬럼으로 만들 수 있는 모든 조합을 그룹화함
- ROLLUP이 앞 컬럼 기준 소계만 만드는 것과 달리, CUBE는 뒤 컬럼 기준 소계까지 만듦
- 컬럼이 n개면 그룹의 종류는 2^n승임
- 모든 조합을 만들므로 컬럼 순서는 결과에 영향을 주지 않음
- 소계·총계 행은 그룹화에 쓰이지 않은 컬럼이 NULL로 채워짐
GROUP BY CUBE(컬럼1, 컬럼2,...)
GROUPING SETS
- GROUPING SETS는 원하는 그룹화 조합만 직접 나열
- 나열한 조합에 대해서만 집계하므로 불필요한 소계가 없음
- 빈 괄호()를 넣으면 전체 총계 행이 포함
- ROLLUP·CUBE로 표현 할 수 없는 임의의 조합도 명시할 수 있음
GROUP BY GROUPING SETS(조합1, 조합2,...)
GROUPING 함수
GROUPING 함수의 역할
- GROUPING 함수는 ROLLUP·CUBE·GROUPING SETS에서 생성된 행이 어떤 종류인지 식별하는 함수임
- GROUPING 컬럼은 0또는 1을 반환
- 0: 해당 컬럼이 그룹화에 사용된 일반 그룹 행
- 1: 해당 컬럼이 그룹화에 사용되지 않은 소계·총계 행(NULL로 채워진 행)
- ROLLUP·CUBE 결과의 NULL과 소계·총계가 만든 NULL은 두 종류로 나뉨
- 원본 데이터의 NULL과 소계·총계가 만든 NULL
- GROUPING 함수가 이 둘을 구분하는 유일한 방법임
- 그룹화 함수가 아닌 ROLLUP·CUBE 결과 가공용 함수임