WITH ROLLUP과 명시적 정렬 순서의 관계
MySQL에서 GROUP BY 목록의 열 이름에 ASC 또는 DESC와 같은 명시적 정렬 순서를 지정하고 "WITH ROLLUP" 수정자를 함께 사용하는 경우를 생각해 볼 수 있습니다. 이때 중요한 특징은, ROLLUP이 추가하는 요약(총계) 행은 정렬 순서가 어떻게 지정되었든 관계없이 항상 해당 요약을 계산하는 데 사용된 행들의 맨 뒤에 나타난다는 점입니다.
기본 정렬(오름차순)에서의 출력
MySQL의 기본 정렬 순서는 오름차순(ASC)입니다. 따라서 아래 예제처럼 별도의 정렬 순서를 지정하지 않으면 다음과 같은 결과를 얻게 됩니다.
mysql> Select sr, SUM(Price) AS Price from ratelist Group by sr with rollup;
+-----+-------+
| sr | Price |
+-----+-------+
| 1 | 502 |
| 2 | 630 |
| 3 | 1005 |
| 4 | 850 |
| 5 | 250 |
|NULL | 3237 |
+-----+-------+
6 rows in set (0.00 sec)
sr 열이 오름차순(1 → 5)으로 정렬되어 있으며, 전체 합계인 3237이 담긴 요약 행(NULL)이 결과의 가장 마지막에 추가된 것을 확인할 수 있습니다.
내림차순(DESC)으로 변경했을 때의 출력
이번에는 동일한 쿼리에 정렬 순서를 내림차순(DESC)으로 지정해 보겠습니다.
mysql> Select sr, SUM(Price) AS Price from ratelist Group by sr DESC with rollup;
+-----+-------+
| sr | Price |
+-----+-------+
| 5 | 250 |
| 4 | 850 |
| 3 | 1005 |
| 2 | 630 |
| 1 | 502 |
|NULL | 3237 |
+-----+-------+
6 rows in set (0.00 sec)
출력 결과를 보면 sr 열은 내림차순(5 → 1)으로 정렬되었지만, 요약 행(sr 값이 NULL인 행)은 여전히 일반 데이터 행들의 뒤, 즉 결과의 가장 마지막에 위치합니다.
핵심 정리
이러한 동작은 WITH ROLLUP의 설계 방식 때문입니다. ROLLUP은 슈퍼 집계(super-aggregate) 값을 나타내는 요약 행을 결과 집합의 끝에 자동으로 추가하며, 사용자가 지정한 ASC 또는 DESC 정렬 순서는 이 요약 행의 위치에는 영향을 주지 않습니다. 따라서 정렬 순서를 어떻게 바꾸더라도 요약 행은 항상 그것이 계산된 기준 행들보다 뒤에 표시된다는 점을 기억해 두면 됩니다.