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

MySQL에서 동일한 열 값끼리 합계 구하기 – GROUP BY와 SUM 활용법

MySQL에서 같은 열(컬럼) 값을 가진 여러 행의 합계를 구하려면 GROUP BY 절과 SUM() 집계 함수를 함께 사용하면 됩니다. 이 글에서는 예제 테이블을 만들고, 직렬 번호별 비용 합계를 구하는 과정을 단계별로 살펴보겠습니다.

1단계: 테이블 생성

먼저 예제에 사용할 테이블을 생성합니다.

mysql> create table sumOfFieldsDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ClientSerialNumber varchar(100),
-> ClientCost int
-> );
Query OK, 0 rows affected (0.50 sec)

2단계: 데이터 삽입

INSERT 명령을 사용해 몇 개의 레코드를 삽입합니다. 일부러 같은 직렬 번호가 여러 번 등장하도록 데이터를 구성했습니다.

mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('1111',450);
Query OK, 1 row affected (0.16 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('2222',550);
Query OK, 1 row affected (0.15 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('3333',150);
Query OK, 1 row affected (0.64 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('3333',250);
Query OK, 1 row affected (0.12 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('2222',1000);
Query OK, 1 row affected (0.10 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('1111',1000);
Query OK, 1 row affected (0.16 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('1111',500);
Query OK, 1 row affected (0.17 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('4444',100);
Query OK, 1 row affected (0.17 sec)

3단계: 전체 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select * from sumOfFieldsDemo;

실행 결과는 다음과 같습니다.

+----+--------------------+------------+
| Id | ClientSerialNumber | ClientCost |
+----+--------------------+------------+
| 1 | 1111 | 450 |
| 2 | 2222 | 550 |
| 3 | 3333 | 150 |
| 4 | 3333 | 250 |
| 5 | 2222 | 1000 |
| 6 | 1111 | 1000 |
| 7 | 1111 | 500 |
| 8 | 4444 | 100 |
+----+--------------------+------------+
8 rows in set (0.00 sec)

4단계: GROUP BY로 그룹별 합계 구하기

이제 GROUP BY를 사용해 동일한 ClientSerialNumber 값을 가진 행들의 ClientCost 합계를 구하는 쿼리입니다.

mysql> select Id,ClientSerialNumber,SUM(ClientCost) AS TotalSum
-> from sumOfFieldsDemo
-> group by ClientSerialNumber;

실행 결과는 다음과 같습니다.

+----+--------------------+----------+
| Id | ClientSerialNumber | TotalSum |
+----+--------------------+----------+
| 1 | 1111 | 1950 |
| 2 | 2222 | 1550 |
| 3 | 3333 | 400 |
| 8 | 4444 | 100 |
+----+--------------------+----------+
4 rows in set (0.00 sec)

결과 해석 및 참고 사항

위 결과를 보면 각 직렬 번호별로 비용이 정확히 합산된 것을 확인할 수 있습니다.

  • 1111: 450 + 1000 + 500 = 1950
  • 2222: 550 + 1000 = 1550
  • 3333: 150 + 250 = 400
  • 4444: 100 = 100

다만 한 가지 주의할 점이 있습니다. SELECT 목록에 포함된 Id는 GROUP BY 기준 열이 아니기 때문에, 해당 그룹 내 임의의 한 행의 값이 표시됩니다. MySQL 5.7 이상에서는 기본적으로 ONLY_FULL_GROUP_BY SQL 모드가 활성화되어 있어, 이런 쿼리는 오류가 발생할 수 있습니다. 이 경우 Id를 SELECT 목록에서 제거하거나, MIN(Id), MAX(Id)처럼 집계 함수로 감싸서 사용하는 것이 안전합니다.

mysql> select MIN(Id) AS FirstId, ClientSerialNumber, SUM(ClientCost) AS TotalSum
-> from sumOfFieldsDemo
-> group by ClientSerialNumber;

이처럼 GROUP BY와 SUM()만 활용하면 동일한 열 값을 가진 필드들의 합계를 손쉽게 계산할 수 있습니다.