[SQL] OVER(), ROLLUP, GROUPING

oliveYeong·2023년 1월 6일

1. over() ?

  • group by를 사용하지 않고, 어떤 값을 가준으로 합 합이나, 카운트, min, max, avg 등의 집계 함수값을 구해서 일반 데이터와 함께 출력할 수 있다.

A, B, C, D 라는 기준으로 두 개씩 묶어서 합계를 구하고 싶을 때, ROLLUP()을 쓰기는 아주 번거롭기 때문에, 묶고 싶은 조건을 PARTITION BY로 묶어 OVER()함수를 사용할 수 있다.

SELECT
		coutry, year, profit,
		SUM(profit) OVER(PARTITION BY country) AS country_profit
FROM	sales;



2. ROLLUP ?

  • 여러 항목으로 GROUP BY를 한 다움, 중간 그룹별로 통계값이 필요한 경우에 유용한 함수이다.
  • 주로 분류해야 되는 값이 많은 데이터를 다룰 때, 통계를 내야할 때 사용한다.
SELECT
		country, year, genre, SUM(sales)
FROM
		booksales
GROUP BY country, year, genre WITH ROLLUP;
  • ROLLUP을 한 경우, 중간중간 그룹마다 통계값이 생성된다.
  • 현재는 ROLLUP과 ORDER BY는 같이 지원되지 않는다.



3. GROUPING ?

  • ROLLUP과 함께 쓰기 좋은 함수로, ROLLUP한 중간 통계값이 NULL이 나오기 때문에, 실제로 NULL인 값과 혼동될 우려가 있다. 이럴 때, 어떤 값이 롤업으로 그루핑 된 것인지 알 수 있게 하는 것이 GROUPING 함수이다.

  • 그룹함수에 의해 컬럼 값이 소계나 총합 등 집계된 데이터일 경우, 1을 리턴하고 만약 집계된 데이터가 아니면 0을 리턴한다.

1, 0으로 리턴되는 방식을 이용하여,
소계값일 때(1일 때)의 그루핑 이름을 달고,
NULL값일 때(0일 때)의 그루핑 이름을 달아 구별할 수 있다.

SELECT CASE
			WHEN GROUPING(country) = 1 THEN '나라별 합계'
            WHEN country IS NULL THEN '나라 null값 합계'
FROM sales;
  • GROUPING은 소계, 집계함수값인지 이분법적으로 구분해주기 때문에, GROUP BY로 취합된 값은 NULL과 동일시 되어 0을 리턴한다.



참고자료


https://jhnyang.tistory.com/473

https://jinjungs.github.io/til/210805_TIL/

profile
[올리 공부기록] 한계단씩 꾸준히 성장하기

0개의 댓글