GROUP BY의 확장 기능으로, 단순 그룹별 집계를 넘어 소계(Subtotal)와 총계(Grand Total)를 자동으로 생성하는 고급 집계 함수. 주로 보고서 작성 및 다차원 분석에 사용됨.
ROLLUP - 계층적 소계 및 총계ROLLUP은 GROUP BY 절에 지정된 컬럼들의 계층 구조를 따라 소계와 총계를 생성함.
GROUP BY ROLLUP(A, B)는 다음 세 가지 레벨의 집계를 순차적으로 생성함:
1. GROUP BY A, B (가장 상세한 그룹)
2. GROUP BY A (A 기준 소계)
3. 전체 총계
ROLLUP의 결과에서 소계 또는 총계 행은, 집계의 기준이 된 컬럼이 NULL로 표시됨.
/*
* -- ROLLUP 예시 --
* (user_id, post_type) 그룹별 조회수 합계,
* (user_id) 그룹별 조회수 소계,
* 그리고 전체 총계를 한 번에 조회함.
*/
SELECT
user_id,
post_type,
SUM(view_count) AS total_views
FROM
Post
GROUP BY
ROLLUP(user_id, post_type)
ORDER BY
user_id, post_type;
결과 해석:
user_id와 post_type에 모두 값이 있으면: (user_id, post_type) 그룹의 집계post_type이 NULL이면: 해당 user_id의 소계user_id와 post_type이 모두 NULL이면: 전체 총계CUBE - 모든 조합의 소계 및 총계CUBE는 ROLLUP과 달리 계층에 상관없이, 지정된 컬럼들로 만들 수 있는 모든 가능한 조합의 그룹에 대한 소계와 총계를 생성함.
GROUP BY CUBE(A, B)는 다음 네 가지 조합의 집계를 모두 생성함:
1. GROUP BY A, B
2. GROUP BY A (A 기준 소계)
3. GROUP BY B (B 기준 소계) - ROLLUP과의 핵심적인 차이점
4. 전체 총계
/*
* -- CUBE 예시 --
* (사용자별, 종류별), (사용자별), (종류별), (전체) 조회수 합계를 모두 조회함.
*/
SELECT
user_id,
post_type,
SUM(view_count) AS total_views
FROM
Post
GROUP BY
CUBE(user_id, post_type)
ORDER BY
user_id, post_type;
GROUPING 함수 - 집계 NULL 구분 (SQLD 핵심)ROLLUP이나 CUBE에 의해 생성된 소계/총계 행의 NULL과 실제 데이터 값이 NULL인 것을 구분하기 위해 사용함.
GROUPING(컬럼명)NULL로 표시된 가짜 NULL임.NULL인 데이터 포함)SELECT
user_id,
post_type,
SUM(view_count) AS total_views,
GROUPING(user_id) AS G_USER, -- user_id가 집계되었으면 1
GROUPING(post_type) AS G_TYPE -- post_type이 집계되었으면 1
FROM
Post
GROUP BY
ROLLUP(user_id, post_type)
ORDER BY
user_id, post_type;
※ 실전 팁:
CASE문과GROUPING함수를 함께 사용하면 소계/총계 행에 '소계', '총합계' 등 의미 있는 문자열을 출력하여 보고서의 가독성을 크게 높일 수 있음.
GROUPING SETS - 원하는 그룹 조합만 지정ROLLUP이나 CUBE와 달리, 개발자가 원하는 그룹 조합만 명시적으로 지정하여 집계를 생성하는 가장 유연한 함수.
GROUPING SETS를 사용하면 ROLLUP, CUBE와 동일한 결과를 만들 수 있을 뿐만 아니라, 불필요한 집계를 제외한 맞춤형 집합을 생성할 수 있음./*
* -- GROUPING SETS 예시 --
* (user_id, post_type) 그룹, (post_type) 그룹, 전체 총계()
* 이렇게 3가지 종류의 집계만 생성함.
*/
SELECT
user_id,
post_type,
SUM(view_count) AS total_views
FROM
Post
GROUP BY
GROUPING SETS(
(user_id, post_type),
(post_type),
()
);
ROLLUP(컬럼 N개) → N+1개의 집계 레벨 생성CUBE(컬럼 N개) → 2^N개의 집계 레벨 생성GROUPING SETS(괄호 N개) → N개의 집계 레벨 생성ROLLUP vs CUBE: 두 함수의 가장 큰 차이는 ROLLUP(A, B)는 (B) 소계를 만들지 않지만, CUBE(A, B)는 (B) 소계를 만든다는 점. 이 차이점을 묻는 문제가 단골로 출제됨.GROUPING 함수 해석: GROUPING 함수의 결과가 0과 1일 때의 의미를 정확히 알고, 주어진 결과 테이블을 통해 원본 쿼리(ROLLUP인지 CUBE인지)를 유추하는 유형이 자주 나옴.GROUP BY 컬럼, ROLLUP(컬럼)과 같이 일반 GROUP BY와 ROLLUP을 혼합했을 때, 전체 총계가 생성되지 않고 지정된 컬럼 내에서만 소계가 생성된다는 점을 이해해야 함.