반응형
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값이 없으므로 아래와 같이 작성해도 같은 결과를 얻을 수 있습니다.
반응형
'Database > MySQL' 카테고리의 다른 글
[MySQL] FIRST_VALUE(), LAST_VALUE(), NTH_VALUE() (0) | 2024.12.16 |
---|---|
[MySQL] CUME_DIST(), PERCENT_RANK(), NTILE() (0) | 2024.10.23 |
[MySQL] CTE 활용하기 - WITH / RECURSIVE WITH (0) | 2024.10.17 |
[MySQL] 뷰(VIEW) 개념과 사용 방법 (0) | 2024.10.17 |
[MySQL] 집합 연산자 - UNION / UNION ALL / INTERSECT / EXCEPT (0) | 2024.10.16 |