소계와 총계: ROLLUP, CUBE, GROUPING SETS
보고서에는 부서별·월별 합계 옆에 "부서 소계"와 "총계"가 함께 나와야 할 때가 많습니다.
GROUP BY한 번으로는 한 단계의 합계만 나오므로, 표준 SQL 은 여러 단계를 한 번에 만드는ROLLUP·CUBE·GROUPING SETS를 제공합니다. 이 세 문법은 H2 가 모든 모드에서 지원하지 않아, 문법과 도식 결과 표로 보이고UNION ALL대체 쿼리로 실제 실행해 확인합니다.
1. 왜 배우는가
GROUP BY dept, mon 은 부서와 월 조합마다 한 행을 만듭니다. 부서별 합계나 전체 합계를 함께 보려면 쿼리를 따로 돌려 애플리케이션에서 이어 붙이거나, GROUP BY 를 여러 개 쓰고 UNION ALL 로 붙여야 합니다. 후자는 테이블을 세 번 읽고 쿼리도 길어집니다.
ROLLUP·CUBE·GROUPING SETS 는 이 일을 한 번의 GROUP BY 로 합니다. 테이블을 한 번만 읽어 여러 단계의 집계를 만들 수 있고, 보고서용 쿼리가 짧아집니다. 현장의 월간 매출 보고서, 부서별 집계표가 대부분 이 문법을 씁니다.
다만 이 문법에는 함정이 하나 있습니다. 소계로 합쳐진 컬럼이 NULL 로 표시되는데, 원래 데이터에 NULL 이 있으면 둘을 구분할 수 없습니다. 이 레슨은 문법과 함께 GROUPING() 함수와, 미지원 환경에서 쓰는 UNION ALL 대체 패턴, 구분 컬럼으로 이 문제를 푸는 방법을 다룹니다.