[SQLD] 09. 그룹 함수 (ROLLUP, CUBE, GROUPING SETS)

TJK·2025년 8월 1일

그룹 함수 (ROLLUP, CUBE, GROUPING SETS)

GROUP BY의 확장 기능으로, 단순 그룹별 집계를 넘어 소계(Subtotal)총계(Grand Total)를 자동으로 생성하는 고급 집계 함수. 주로 보고서 작성 및 다차원 분석에 사용됨.


1. ROLLUP - 계층적 소계 및 총계

ROLLUPGROUP 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_idpost_type에 모두 값이 있으면: (user_id, post_type) 그룹의 집계
  • post_typeNULL이면: 해당 user_id의 소계
  • user_idpost_type이 모두 NULL이면: 전체 총계

2. CUBE - 모든 조합의 소계 및 총계

CUBEROLLUP과 달리 계층에 상관없이, 지정된 컬럼들로 만들 수 있는 모든 가능한 조합의 그룹에 대한 소계와 총계를 생성함.
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;

3. GROUPING 함수 - 집계 NULL 구분 (SQLD 핵심)

ROLLUP이나 CUBE에 의해 생성된 소계/총계 행의 NULL과 실제 데이터 값이 NULL인 것을 구분하기 위해 사용함.

  • GROUPING(컬럼명)
    • 결과가 1: 해당 컬럼이 집계되어(Roll up 되어) NULL로 표시된 가짜 NULL임.
    • 결과가 0: 해당 컬럼이 그룹화의 기준이 된 실제 데이터임. (원래부터 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 함수를 함께 사용하면 소계/총계 행에 '소계', '총합계' 등 의미 있는 문자열을 출력하여 보고서의 가독성을 크게 높일 수 있음.


4. 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),
        ()
    );

5. 시험 문제 유형 및 함정 포인트

  • 집계 레벨(행 수) 계산:
    • 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 함수의 결과가 01일 때의 의미를 정확히 알고, 주어진 결과 테이블을 통해 원본 쿼리(ROLLUP인지 CUBE인지)를 유추하는 유형이 자주 나옴.
  • 혼합 사용: GROUP BY 컬럼, ROLLUP(컬럼)과 같이 일반 GROUP BYROLLUP을 혼합했을 때, 전체 총계가 생성되지 않고 지정된 컬럼 내에서만 소계가 생성된다는 점을 이해해야 함.
profile
Hello world!

0개의 댓글