MySQL의 WITH ROLLUP은 GROUP BY 절과 함께 사용하여 그룹별 소계와 전체 총계를 한 번의 쿼리로 손쉽게 계산할 수 있는 강력한 기능입니다. 이 글에서는 WITH ROLLUP의 기본 문법부터 실제 예제까지 단계별로 살펴보겠습니다.
WITH ROLLUP 기본 문법
WITH ROLLUP을 사용하는 기본적인 문법은 다음과 같습니다.
SELECT yourColumnName1, SUM(yourColumnName2) FROM yourTableName GROUP BY yourColumnName1 WITH ROLLUP;
예제 테이블 생성하기
먼저 실습에 사용할 테이블을 생성해 보겠습니다.
mysql> CREATE TABLE DemoTable1622
-> (
-> EmployeeCountryName varchar(20),
-> EmployeeSalary int
-> );
Query OK, 0 rows affected (0.44 sec)데이터 삽입하기
INSERT 명령어를 사용해 테이블에 샘플 데이터를 입력합니다.
mysql> INSERT INTO DemoTable1622 VALUES('US',4500);
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO DemoTable1622 VALUES('UK',1500);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable1622 VALUES('AUS',1700);
Query OK, 1 row affected (0.19 sec)
mysql> INSERT INTO DemoTable1622 VALUES('UK',1900);
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO DemoTable1622 VALUES('US',3900);
Query OK, 1 row affected (0.42 sec)저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> SELECT * FROM DemoTable1622;
위 쿼리는 다음과 같은 결과를 출력합니다.
+---------------------+----------------+ | EmployeeCountryName | EmployeeSalary | +---------------------+----------------+ | US | 4500 | | UK | 1500 | | AUS | 1700 | | UK | 1900 | | US | 3900 | +---------------------+----------------+ 5 rows in set (0.00 sec)
WITH ROLLUP 적용하기
이제 국가별 직원 급여의 합계와 함께 전체 총합을 구하기 위해 WITH ROLLUP을 적용한 쿼리를 실행해 보겠습니다.
mysql> SELECT EmployeeCountryName, SUM(EmployeeSalary) FROM DemoTable1622
-> GROUP BY EmployeeCountryName WITH ROLLUP;실행 결과는 다음과 같습니다.
+---------------------+---------------------+ | EmployeeCountryName | sum(EmployeeSalary) | +---------------------+---------------------+ | AUS | 1700 | | UK | 3400 | | US | 8400 | | NULL | 13500 | +---------------------+---------------------+ 4 rows in set (0.02 sec)
결과 해석
출력 결과를 살펴보면 각 국가(AUS, UK, US)별로 급여 합계가 그룹화되어 표시되고, 마지막 행에는 NULL 값과 함께 전체 급여 총합인 13,500이 출력됩니다. 이처럼 WITH ROLLUP은 그룹별 집계 결과 뒤에 자동으로 슈퍼 집계(super-aggregate) 행을 추가해 주기 때문에, 별도의 쿼리를 추가로 작성하지 않고도 소계와 총계를 동시에 확인할 수 있습니다.
참고로 NULL로 표시되는 총계 행의 라벨을 '전체 합계' 같은 의미 있는 이름으로 바꾸고 싶다면 COALESCE 함수나 IFNULL 함수를 활용하면 더욱 가독성 높은 리포트를 만들 수 있습니다.