[PostgreSQL] Group by와 집계 함수

Date:     Updated:

카테고리:

태그:

인프런에 있는 권철민님의 데이터 분석 SQL Fundamentals 강의를 듣고 정리한 내용입니다.


🐘 Group by

groupby

  • Group화 한 데이터를 토대로 집계 함수(Aggregation function)와 함께 사용
  • Group by에 사용한 column이 primary key 역할 가능


SELECT
    genre,
    SUM(qty) AS total
FROM MOVIE
GROUP BY genre


GROUPING SET

SELECT *
FROM TABLE1
GROUP BY
GROUPING SETS
(
  (COL1),
  (COL2),
  (COL3)
)
  • (GROUP BY COL1) UNION ALL (GROUP BY COL2) UNION ALL (GROUP BY COL3)와 같음
  • GORUPING 함수는 해당 행 기준 column이 집계에 사용되었으면 0, 그렇지 않으면 1을 리턴함
  • 이를 활용하면 다음과 같이 가공하기 좋음


개키우는 개발자 님의 블로그를 참고했습니다.

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


grouping


Having

SELECT
    CUSTOMER_ID,
    SUM(AMOUNT) AS AMOUNT_SUM
FROM PAYMENT
GROUP BY CUSTOMER_ID
HAVING SUM(AMOUNT) > 200 -- 필터링
ORDER BY CUSTOMER_ID; -- 정렬
  • GROUP BY 후 필터링


Aggregation Function

Function Description
Count 데이터 건수 리턴
Count(distinct col) Group by에 사용한 column 값 중 중복을 제외하고 count
Sum(col) 총 합 리턴
Min(col) 최솟값 리턴
Max(col) 최댓값 리턴
Avg(col) 평균값 리턴
  • NULL값은 집계에서 제외함
    • 집계하고 싶다면 Coalesce 함수 이용
  • Min, Max의 경우 date, timestamp 등의 타입에서도 가능


응용 - 행 레벨 데이터 열 레벨로 전환하기

Year Month Revenue
2016 1 10
2016 2 25
2016 3 40
2016
2016 12 78


SELECT
    Year, sum(revenue) as Year_rev,
    sum(case when Month = 1 then revenue end) as January, 
    sum(case when Month = 2 then revenue end) as February,
    ...
    sum(case when Month = 12 then revenue end) as December,
FROM sales
GROUP BY Year


Year Year_rev January February December
2016 450 10 25 78


ROLLUP

SELECT 
    Type, Store, sum(Number) as Number
FROM Pet
GROUP BY ROLLUP(Type, Store)
ORDER BY 1,2;

rollup

  • 계층적인 방식으로 Group by 진행 (파라미터 순서 기준)
  • n+1 번 Group by 수행 (n: rollup의 파라미터 갯수)


CUBE

SELECT 
    Type, Store, sum(Number) as Number
FROM Pet
GROUP BY CUBE(Type, Store)
ORDER BY 1,2;

cube

  • 파라미터별 동등한 기준으로 Group by 진행
  • 2^n 번 Group by 수행 (n: cube의 파라미터 갯수)


맨 위로 이동하기

SQL 카테고리 내 다른 글 보러가기

댓글 남기기