개키우는개발자 : )

PostgreSQL GROUPING SET 절 본문

PostgreSQL/조인과 집계 데이터

PostgreSQL GROUPING SET 절

DOGvelopers 2019. 11. 5. 22:30
반응형

실습테이블 만들기 https://dog-developers.tistory.com/140

GROUPING SET 이란?

여러 개의 UNION ALL을 이용한 SQL과 같은 결과를 도출할 수 있다.

 

실습

 

- SALES 테이블을 BRAND 와 SEGMENT 컬럼 기준으로 GROUP BY 합니다.

SELECT
	BRAND,
	SEGMENT,
	SUM (QUANTITY)
FROM
	SALES
GROUP BY
	BRAND,
	SEGMENT;

일반적인 조회와 값이 별다른 변화가 없습니다.

실습1

- SALES 테이블을 BRAND 컬럼 기준으로 GROUP BY 합니다.

SELECT
	BRAND,
	SUM (QUANTITY)
FROM
	SALES
GROUP BY
	BRAND;

그룹화된 BRAND 의 QUANTITY의 합계를 보여줍니다.

실습2

- SALES 테이블을 SEGMENT컬럼 기준으로 GROUP BY 합니다.

SELECT
	SEGMENT,
	SUM (QUANTITY)
FROM
	SALES
GROUP BY
	SEGMENT;

그룹화된 SEGMENT의 QUANTITY의 합계를 보여줍니다.

실습3

- SALES 테이블의 QUANTITY 컬럼의 합계를 조회합니다.

SELECT
	SUM (QUANTITY)
FROM
	SALES

모든 합계

실습4

 

- SALES 테이블의 UNION ALL을 이용하여 BRAND,SEGMENT 기준, BRAND 기준, SEGMENT기준, 전체 기준으로 QUANTITY 합계의 값을 구합니다.

 

SELECT
	BRAND,
	SEGMENT,
	SUM(QUANTITY)
FROM
	SALES
GROUP BY
	BRAND,
	SEGMENT
UNION ALL
SELECT
	BRAND,
	NULL,
	SUM(QUANTITY)
FROM
	SALES
GROUP BY
	BRAND
UNION ALL
select
	NULL,
	SEGMENT,
	SUM(QUANTITY)
FROM
	SALES
GROUP BY
	SEGMENT
UNION ALL
SELECT
	NULL,
	NULL,
	SUM(QUANTITY)
FROM
	SALES

UNION ALL 은 SELECT 리스트의 컬럼이 같은수의 동일한 형식이라면 데이터 집합을 합쳐주는 역할을 합니다.

실습5

 

- GROUPING SET 절 기본문법

SELECT
	C1,
    C2,
    집계 함수(C3)
FROM
	TABLE_NAME
GROUP BY
GROUPING SETS
(
	(C1,C2),
    (C1),
    (C2),
    ()
);

 

- 위의 UNION ALL 작성법을 GROUPING SET 문법을 활용하여 작성 합니다.

SELECT
	BRAND,
	SEGMENT,
	SUM(QUANTITY)
FROM
	SALES
GROUP BY 
GROUPING SETS 
(
	(BRAND,SEGMENT),
	(BRAND),
	(SEGMENT),
	()
)

동일한 데이터를 훨씬 간결하게 작성할 수 있습니다.

실습6

- GROUPING SET 절의 GROUPING 함수를 활용

SELECT
	GROUPING(BRAND) GROUPING_BRAND,
	GROUPING(SEGMENT) GROUPING_SEGMENT,
	BRAND,
	SEGMENT,
	SUM(QUANTITY)
FROM
	SALES
GROUP BY 
GROUPING SETS 
(
	(BRAND,SEGMENT),
	(BRAND),
	(SEGMENT),
	()
)
ORDER BY BRAND,SEGMENT

GROUPING 함수는 매우 유용한 함수 입니다.

해당 컬럼이 집계에 사용되었으면 0, 그렇지 않으면 1을 리턴 합니다.

실습7

- 좀더 보기쉽게 가공하여 조회하기

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(QUANTITY)
FROM
	SALES
GROUP BY
	GROUPING SETS ( (BRAND,
	SEGMENT),
	(BRAND),
	(SEGMENT),
	() )
ORDER BY
	BRAND,
	SEGMENT

직관적으로 확인할 수 있어 훨씬 이해하기 쉽게 CASE문을 활용하여 작성합니다.

실습8

 

반응형

'PostgreSQL > 조인과 집계 데이터' 카테고리의 다른 글

PostgreSQL CUBE 절  (0) 2019.11.09
PostgreSQL ROLL UP절  (0) 2019.11.09
PostgreSQL HAVING 절  (0) 2019.11.05
PostgreSQL GROUP BY 절  (0) 2019.11.05
PostgreSQL NATURAL 조인  (0) 2019.11.05
Comments