다양한 기준으로 집계함수(sum, count 등)를 사용하여 도출한 결과를 한 눈에 보려면 UNION ALL 을 써야 한다.
이것을 쉽게 정리할 수 있게 돕는다
판매 제품에 대한 테이블이 있다
CREATE TABLE sales_items
(
brand varchar NOT NULL
,segment varchar NOT NULL
,revenue int NOT NULL
,primary KEY (brand, segment)
);
INSERT INTO sales_items (brand, segment, revenue)
VALUES
('abc', 'premium', 100)
,('abc','basic',200)
,('xyz','premium',100)
,('xyz', 'basic', 300)
;
브랜드 별, 세그먼트 별, 전체 집계를 보고 싶다
SELECT
brand
, sum(revenue)
FROM sales_items
GROUP BY brand;
SELECT
segment
, sum(revenue)
FROM sales_items
GROUP BY segment ;
SELECT
sum(revenue)
FROM sales_items ;
따로 보는 집계를 합치고 싶다 - UNION ALL
SELECT
brand
,segment
,sum(revenue)
FROM sales_items
GROUP BY brand, segment
UNION ALL
SELECT
brand
,NULL
,sum(revenue)
FROM sales_items
GROUP BY brand
UNION ALL
SELECT
NULL
,segment
,sum(revenue)
FROM sales_items
GROUP BY segment
UNION ALL
SELECT
NULL
,NULL
, sum(revenue)
FROM sales_items;
단순하게 전부 UNION ALL로 합칠 수 있으나, 가독성도 떨어지고 생산성도 낮다
UNION ALL을 쓰지 않고 쉽게 그룹핑 하고 싶다 - GROUPING SETS 절
SELECT
brand
,segment
,sum(revenue)
FROM sales_items
GROUP BY
GROUPING SETS (
(brand, segment)
,(brand)
,(segment)
,()
);
위와 결과가 같다
그룹핑 기준을 파악하고 싶다 - GROUPING 함수
집계에 포함되면 0, 포함되지 않으면 1 값을 리턴(반환) 한다
SELECT
GROUPING (brand) grouping_brand
,GROUPING (segment) grouping_segment
,brand
,segment
,sum(revenue)
FROM sales_items
GROUP BY
GROUPING SETS (
(brand,segment)
,(brand)
,(segment)
,()
);
1행은 브랜드, 세그먼트 둘 다 포함되지 않아서 1,1을 반환 하였다
판매 제품의 매출을 여러 기준으로 정렬하고 결과까지 보고 싶다 - GROUPING SETS 절, GROUPING 함수 활용
SELECT
CASE WHEN GROUPING(brand) = 0 AND GROUPING(segment) = 0 THEN '브랜드별+등급별'
WHEN GROUPING(brand) = 0 AND grouping(segment) = 1 THEN '브랜드별'
WHEN GROUPING(brand) = 1 AND grouping(segment) = 0 THEN '등급별'
WHEN grouping(brand) = 1 AND grouping(segment) = 1 THEN '전체합계'
ELSE ''
END AS "집계기준"
,brand
,segment
,sum(revenue)
FROM sales_items
GROUP BY
GROUPING SETS (
(brand,segment)
,(brand)
,(segment)
,()
)
ORDER BY brand, segment
;
아래와 같이 나온다
'데이터 분석 > SQL' 카테고리의 다른 글
[SQL 문법] CUBE () 절 (0) | 2020.11.05 |
---|---|
[SQL 문법] ROLLUP ( ) 절 (0) | 2020.11.05 |
[SQL 문법] HAVING (0) | 2020.11.04 |
[SQL 문법] GROUP BY (0) | 2020.11.04 |
[SQL 문법] NATURAL JOIN (0) | 2020.11.04 |