Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 쿼리 결과 마지막 행에 합계(Total) 추가하는 방법

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를 함께 사용해 합계 행의 위치를 명시적으로 제어할 수도 있습니다. 또한 애플리케이션 단에서 합계를 처리하는 것이 더 적절한 경우도 있으니, 상황에 맞게 선택하는 것이 좋습니다.