Database/MySQL

[MySQL] WITH ROLLUP으로 집계 나타내기

루루23 2024. 10. 18. 10:14
반응형

 

1. WITH ROLLUP

GROUP BY 절과 함께 사용하여 그룹별 소계와 전체 합계를 자동으로 계산해주는 기능

 

2. 기본 사용법

테이블 생성 및 샘플 데이터 삽입

CREATE TABLE sales (
    id INT PRIMARY KEY,
    year INT,
    month VARCHAR(10),
    category VARCHAR(50),
    revenue INT
);

INSERT INTO sales (id, year, month, category, revenue) VALUES
(1, 2023, 'Jan', 'Electronics', 1000),
(2, 2023, 'Feb', 'Electronics', 1500),
(3, 2023, 'Jan', 'Furniture', 800),
(4, 2023, 'Feb', 'Furniture', 1200),
(5, 2023, 'Mar', 'Electronics', 2000),
(6, 2023, 'Mar', 'Furniture', 900);

 

 

 

기본 GROUP BY 쿼리와 WITH ROLLUP 차이

 

1) GROUP BY

SELECT year, month, category, SUM(revenue) AS total_revenue
FROM sales
GROUP BY year, month, category;

 

 

2) WITH ROLLUP 

SELECT year, month, category, SUM(revenue) AS total_revenue
FROM sales
GROUP BY year, month, category WITH ROLLUP;

 

 

group by 순서가 바뀌면 당연히 결과도 바뀝니다.

SELECT category, year, month, SUM(revenue) AS total_revenue
FROM sales
GROUP BY category,year, month WITH ROLLUP;

 

3. NULL 처리와 GROUPING 함수 활용

WITH ROLLUP을 사용하면 소계와 전체 합계 행에 NULL 값이 나타납니다.

이를 처리하기 위해 GROUPING() 함수를 사용할 수 있습니다.

 

GROUPING(column_name)은 해당 열이 소계/합계 행인지를 판별합니다.

  • 0: 해당 열이 기존 데이터 행에서 온 값임을 의미
  • 1: 해당 열이 ROLLUP에 의해 생성된 소계나 합계 행에 속한 값임을 의미

 

GROUPING을 사용해 NULL을 'Total'로 표시하기

SELECT 
    IF(GROUPING(year), 'Total', year) AS year,
    IF(GROUPING(month), 'Total', month) AS month,
    IF(GROUPING(category), 'Total', category) AS category,
    SUM(revenue) AS total_revenue
FROM sales
GROUP BY year, month, category WITH ROLLUP;

 

 

사실 행에 NULL 값이 없다는 걸 알고 있다면 IFNULL을 사용해도 됩니다. 이 예제에서는 NULL값이 없으므로 아래와 같이 작성해도 같은 결과를 얻을 수 있습니다.

 

반응형