A, B, C, D 라는 기준으로 두 개씩 묶어서 합계를 구하고 싶을 때, ROLLUP()을 쓰기는 아주 번거롭기 때문에, 묶고 싶은 조건을 PARTITION BY로 묶어 OVER()함수를 사용할 수 있다.
SELECT
coutry, year, profit,
SUM(profit) OVER(PARTITION BY country) AS country_profit
FROM sales;
SELECT
country, year, genre, SUM(sales)
FROM
booksales
GROUP BY country, year, genre WITH ROLLUP;
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;