데이터 분석/SQL

[SQL 문법] GROUPING SET 절, GROUPING 함수

참치바나나 2020. 11. 4. 16:33

다양한 기준으로 집계함수(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