이처럼 칼럼 값 자체에 NULL이 있을 때 WITH ROLLUP을 포함한 집계 쿼리를 사용하면 NULL인 건이 집계된 로우와 총계가 계산된 로우를 구분하기 어렵습니다. 물론 이 예제에서는 마지막 로우의 금액이 크기 때문에 총계임을 쉽게 유추할 수 있지만, SUM() 함수로 계산된 값이 그리 크지 않으면 보통 구분하기가 쉽지 않습니다. 바로 이럴 때 GROUPING() 함수를 사용합니다.
코드 7-20
SELECT movie_type 영화유형, SUM(sale_amt) 금액, GROUPING(movie_type)
FROM box_office
WHERE YEAR(release_date) = 2019
GROUP BY movie_type WITH ROLLUP;
실행결과
코드 7-20을 보면 코드 7-19의 SELECT 절에 GROUPING(movie_type)을 추가했습니다. GROUP BY 절에 명시한 칼럼을 GROUPING() 함수의 매개변수로 넘기면 WITH ROLLUP 구문으로 항목별 소계와 총계가 계산된 로우는 1을, 나머지는 0을 반환합니다. 따라서 결과에서 영화 유형이 NULL인 두 건 중에서 GROUPING() 함수가 1을 반환한 마지막 건이 총계임을 알 수 있습니다.