MySQL에서 조회 결과의 마지막 행에 전체 합계를 표시하고 싶다면 UNION을 활용하면 됩니다. 원본 데이터를 조회하는 SELECT 문과 SUM() 함수로 집계한 SELECT 문을 UNION으로 연결하면, 결과 맨 아래에 합계 행이 자연스럽게 추가됩니다.
기본 문법
(
SELECT 컬럼명1,
컬럼명2,
컬럼명3,
...
FROM 테이블명
)
UNION
(
SELECT "표시할메시지" AS 별칭1,
SUM(컬럼명1) AS 별칭2,
SUM(컬럼명2) AS 별칭3,
...
FROM 테이블명
);첫 번째 SELECT는 일반 데이터를 조회하고, 두 번째 SELECT에서 SUM() 함수로 각 컬럼의 합계를 계산합니다. 이때 첫 번째 컬럼 자리에는 'Total' 같은 라벨 문자열을 넣어 합계 행임을 구분할 수 있게 합니다.
예제 테이블 생성
문법을 이해하기 위해 먼저 예제 테이블을 만들어 보겠습니다.
mysql> create table ProductDemo
-> (
-> ProductId varchar(10),
-> ProductQuantity int,
-> ProductValue int
-> );
Query OK, 0 rows affected (0.63 sec)데이터 삽입
INSERT 명령으로 샘플 데이터를 입력합니다.
mysql> insert into ProductDemo values('Product-1',10,300);
Query OK, 1 row affected (0.10 sec)
mysql> insert into ProductDemo values('Product-2',5,200);
Query OK, 1 row affected (0.17 sec)
mysql> insert into ProductDemo values('Product-3',7,340);
Query OK, 1 row affected (0.13 sec)
mysql> insert into ProductDemo values('Product-4',20,500);
Query OK, 1 row affected (0.10 sec)
mysql> insert into ProductDemo values('Product-5',30,1000);
Query OK, 1 row affected (0.42 sec)전체 데이터 확인
mysql> select *from ProductDemo;
실행 결과는 다음과 같습니다.
+-----------+-----------------+--------------+ | ProductId | ProductQuantity | ProductValue | +-----------+-----------------+--------------+ | Product-1 | 10 | 300 | | Product-2 | 5 | 200 | | Product-3 | 7 | 340 | | Product-4 | 20 | 500 | | Product-5 | 30 | 1000 | +-----------+-----------------+--------------+ 5 rows in set (0.00 sec)
마지막 행에 합계 추가하는 쿼리
이제 UNION을 사용해 결과의 마지막 행에 합계를 출력하는 실제 쿼리입니다.
mysql> (SELECT ProductId,
-> ProductQuantity,
-> ProductValue
-> FROM ProductDemo)
-> UNION
-> (SELECT "Total" AS ProductName,
-> SUM(ProductQuantity) AS TotalQuantity,
-> SUM(ProductValue) AS TotalValue
-> FROM ProductDemo);출력 결과
+-----------+-----------------+--------------+ | ProductId | ProductQuantity | ProductValue | +-----------+-----------------+--------------+ | Product-1 | 10 | 300 | | Product-2 | 5 | 200 | | Product-3 | 7 | 340 | | Product-4 | 20 | 500 | | Product-5 | 30 | 1000 | | Total | 72 | 2340 | +-----------+-----------------+--------------+ 6 rows in set (0.00 sec)
결과를 보면 기존 5개 행 아래에 'Total'이라는 라벨과 함께 수량 합계(72)와 가격 합계(2340)가 마지막 행에 추가된 것을 확인할 수 있습니다.
참고 사항
UNION은 중복 행을 제거하지만, 여기서는 합계 행이 기존 행과 중복될 가능성이 거의 없으므로 문제가 되지 않습니다. 만약 성능이 중요한 대용량 테이블이라면 UNION ALL을 고려할 수 있으며, ORDER BY를 함께 사용해 합계 행의 위치를 명시적으로 제어할 수도 있습니다. 또한 애플리케이션 단에서 합계를 처리하는 것이 더 적절한 경우도 있으니, 상황에 맞게 선택하는 것이 좋습니다.