반응형

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