반응형

SQL의 고급 그룹함수 완벽 정리: ROLLUP, CUBE, GROUPING SETS, GROUPING, CASE문 📊

안녕하세요, 이번 글에서는 SQL의 강력한 분석 기능을 제공하는 고오오급 그룹함수인 ROLLUP, CUBE, GROUPING SETS, GROUPING, 그리고 CASE문과의 활용법에 대해 상세히 알아보겠습니다.


📌 1. ROLLUP

ROLLUP은 지정한 그룹 컬럼들로 단계적인 합계를 계산하여 제공하는 함수입니다. 가장 작은 그룹부터 전체 합계까지 차례로 계산됩니다.

사용법

SELECT dept, job, SUM(salary)
FROM employee
GROUP BY ROLLUP(dept, job);

  • 의미: 부서(dept)와 직무(job)별로 합계를 계산하고, 부서별 합계와 전체 합계를 추가로 계산합니다.
  • 부서와 직무별 합계 > 부서별 합계 > 전체합계

📌 2. CUBE

CUBE는 지정된 그룹 컬럼들로 가능한 모든 조합의 합계를 제공합니다.

사용법

SELECT dept, job, SUM(salary)
FROM employee
GROUP BY CUBE(dept, job);

  • 의미: 부서(dept)별, 직무(job)별, 부서와 직무 조합, 전체 합계를 모두 제공합니다.
  • 부서별 > 직무별 > 부서 + 직무 > 전체

📌 3. GROUPING SETS

GROUPING SETS는 사용자가 원하는 특정 그룹의 조합만 선택적으로 지정하여 합계를 계산할 수 있습니다.

사용법

SELECT dept, job, SUM(salary)
FROM employee
GROUP BY GROUPING SETS ((dept, job), (dept), ());

  • 의미: 부서와 직무 조합, 부서별 합계, 전체 합계만 제공됩니다.

📌 4. GROUPING 함수

GROUPING 함수는 특정 컬럼이 집계된 결과인지 아닌지를 판별해줍니다. ROLLUP, CUBE와 자주 함께 사용됩니다.

사용법

SELECT dept, job, SUM(salary),
       GROUPING(dept) AS dept_group,
       GROUPING(job) AS job_group
FROM employee
GROUP BY ROLLUP(dept, job);

  • 의미: dept 또는 job이 집계된 합계 행이면 1을, 그렇지 않으면 0을 반환합니다.

📌 5. 그룹함수와 CASE문 활용

그룹함수와 CASE문을 함께 사용하면 집계 결과를 더욱 명확하게 표현할 수 있습니다.

사용법

SELECT dept,
       CASE GROUPING(job)
           WHEN 1 THEN '직무 전체 합계'
           ELSE job
       END AS job,
       SUM(salary)
FROM employee
GROUP BY ROLLUP(dept, job);

  • 의미: 직무별 합계가 아닌 전체 합계 행은 '직무 전체 합계'라는 표현으로 명확하게 표시합니다.

📌 예시 결과 분석

DEPT JOB SUM(SALARY)
IT Engineer 5000
IT Developer 4500
IT 직무 전체 합계 9500
HR Recruiter 4000
HR 직무 전체 합계 4000
NULL 직무 전체 합계 13500
  • 부서별, 직무별, 전체 합계가 명확히 표현되었습니다.

🔑 핵심 정리 요약

함수명 역할 사용처
ROLLUP 그룹별 단계적 합계 부서→직무→전체
CUBE 가능한 모든 그룹 조합 합계 다양한 다차원 분석
GROUPING SETS 특정 조합만 선택적으로 합계 맞춤형 분석
GROUPING 그룹핑 여부를 판단(집계된 값인지) ROLLUP, CUBE와 함께 사용
CASE문과 그룹함수 집계 결과를 명확한 표현으로 변경 결과 가독성 향상

🎯 시험을 위한 외우기 쉬운 꿀팁!

  • ROLLUP: "굴려서(ROLL) 단계적으로 UP한다!"
  • CUBE: "모든 면을 가진 주사위(CUBE)처럼 모든 조합을 보여준다!"
  • GROUPING SETS: "내가 원하는 세트만 고른다!"
  • GROUPING: "집계되었나 안되었나? 체크하는 함수!"
  • CASE문과 그룹함수: "CASE는 표현을 명확하게 바꿔주는 친절한 안내자!"

 

반응형
반응형

SQL의 GROUP BY는 집계할 때 필수죠?

그런데 복잡한 다중 그룹을 요약하려면?

ROLLUP, CUBE, GROUPING SETS가 등장합니다! 🎉


🧪 실습용 테이블 만들기

CREATE TABLE sales (
  region VARCHAR(20),     -- 지역
  product VARCHAR(20),    -- 제품
  sales_amt INT           -- 매출액
);

INSERT INTO sales VALUES
('서울', '노트북', 1000),
('서울', '폰', 800),
('부산', '노트북', 1200),
('부산', '폰', 700),
('대전', '폰', 600);

1️⃣ 기본 GROUP BY

SELECT region, product, SUM(sales_amt) AS total_sales
FROM sales
GROUP BY region, product;

 

🧠 설명: 지역 + 제품별로 매출을 합산합니다.

✔️ 결과는 각 조합별 매출 합계만 나옴.


2️⃣  ROLLUP : 단계적 합계 구하기

SELECT region, product, SUM(sales_amt) AS total_sales
FROM sales
GROUP BY ROLLUP(region, product);

 

🧠 설명:

ROLLUP(A, B)은 다음 조합을 자동 계산해줍니다:

  1. (A, B) ← 그룹별
  2. (A, NULL) ← A 단위 소계
  3. (NULL, NULL) ← 전체 합계

✔️ 이걸로 “소계”와 “총합” 자동 계산 가능!


3️⃣  CUBE : 모든 조합 계산

SELECT region, product, SUM(sales_amt) AS total_sales
FROM sales
GROUP BY CUBE(region, product);

 

🧠 설명:

CUBE(A, B)는 가능한 모든 조합을 만들어줍니다:

  • (A, B)
  • (A, NULL)
  • (NULL, B)
  • (NULL, NULL)

즉, 행과 열의 소계까지 모두 구해줌!


4️⃣  GROUPING SETS : 내가 원하는 그룹만

SELECT region, product, SUM(sales_amt) AS total_sales
FROM sales
GROUP BY GROUPING SETS (
  (region, product),
  (region),
  (product),
  ()
);

 

🧠 설명:

GROUPING SETS직접 원하는 집계 조합만 지정할 수 있어요

위 예시는:

  1. (region, product) : 기본 조합
  2. (region) : 지역별 소계
  3. (product) : 제품별 소계
  4. () : 전체합계

✔️ 불필요한 조합은 생략하고!

✔️ 정확히 내가 원하는 집계만 나옴!


5️⃣  GROUPING()함수: NULL은 진짜 NULL일까?

집계 결과에서 NULL은 “소계”를 의미할 때도 있지만,

진짜 NULL일 수도 있죠? 🤔 그래서 도와주는 함수가 GROUPING()!

SELECT
  region,
  product,
  GROUPING(region) AS grp_region,
  GROUPING(product) AS grp_product,
  SUM(sales_amt) AS total_sales
FROM sales
GROUP BY ROLLUP(region, product);

 

  • GROUPING = 1 → 이건 집계용 NULL (즉 소계나 총계)
  • GROUPING = 0 → 이건 진짜 값

 

5️⃣  GROUPING() 함수 + CASE문으로 소계/총계 라벨 붙이기

아래 쿼리는 ROLLUP 결과에 "소계", "총계" 라는 이름을 직관적으로 붙여주는 방법이에요!

SELECT
  CASE 
    WHEN GROUPING(region) = 1 AND GROUPING(product) = 1 THEN '총계'
    WHEN GROUPING(region) = 0 AND GROUPING(product) = 1 THEN region || ' 소계'
    ELSE region
  END AS region_label,
  product,
  SUM(sales_amt) AS total_sales
FROM sales
GROUP BY ROLLUP(region, product);

조건 의미 출력값
GROUPING(region)=1 AND GROUPING(product)=1 둘 다 소계 → 전체 총계 '총계'
GROUPING(product)=1 product만 소계 → 지역 소계 '서울 소계', '부산 소계' 등
그 외 일반 행 그대로 지역명

🧾 요약 정리표

문법 설명 활용 예
ROLLUP(A, B) A, A+B, 전체 합계를 단계적으로 계산 보고서 소계/총계
CUBE(A, B) A, B, A+B, 전체 조합을 모두 계산 피벗 요약
GROUPING SETS 원하는 그룹 조합만 선택적으로 지정 가능 맞춤형 집계
GROUPING(col) 집계 NULL인지 실제 NULL인지 구분 UI 표시 분기처리
반응형

+ Recent posts