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

MySQL 쿼리로 여러 합계(SUM)를 조회하고 별도의 열에 표시하는 방법

MySQL에서 하나의 쿼리로 여러 개의 합계(SUM) 값을 구하고, 그 결과를 각각 별도의 열로 표시하려면 CASE 문을 활용하면 됩니다. CASE 문은 지정한 조건을 만족하는 행만 집계하기 때문에, 예를 들어 선수별 점수 합계처럼 조건별 합계를 한 번의 쿼리로 깔끔하게 조회할 수 있습니다.

기본 문법

여러 조건별 합계를 별도의 열로 가져오는 기본적인 문법은 다음과 같습니다.

SELECT
SUM( CASE WHEN yourColumnName1='yourValue1' THEN yourColumnName2 END ) AS yourSeparateColumnName1,
SUM( CASE WHEN yourColumnName1='yourValue2' THEN yourColumnName2 END ) AS yourSeparateColumnName2,
SUM( CASE WHEN yourColumnName1='yourValue3' THEN yourColumnName2 END ) AS yourSeparateColumnName3,
.
.
.
N
FROM yourTableName;

예제 테이블 생성

문법을 이해하기 위해 먼저 예제용 테이블을 만들어 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.

mysql> create table selectMultipleSumDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> PlayerName varchar(20),
-> PlayerScore int,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.58 sec)

샘플 데이터 입력

이제 INSERT 명령으로 테이블에 레코드를 추가합니다.

mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Maxwell',89);
Query OK, 1 row affected (0.23 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Ricky',98);
Query OK, 1 row affected (0.15 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Maxwell',96);
Query OK, 1 row affected (0.18 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Ricky',78);
Query OK, 1 row affected (0.16 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Maxwell',51);
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Ricky',89);
Query OK, 1 row affected (0.21 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('David',56);
Query OK, 1 row affected (0.15 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('David',65);
Query OK, 1 row affected (0.19 sec)

입력된 전체 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회합니다.

mysql> select *from selectMultipleSumDemo;

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

+----+------------+-------------+
| Id | PlayerName | PlayerScore |
+----+------------+-------------+
| 1 | Maxwell | 89 |
| 2 | Ricky | 98 |
| 3 | Maxwell | 96 |
| 4 | Ricky | 78 |
| 5 | Maxwell | 51 |
| 6 | Ricky | 89 |
| 7 | David | 56 |
| 8 | David | 65 |
+----+------------+-------------+
8 rows in set (0.00 sec)

조건별 합계를 별도의 열로 조회하기

선수 이름(PlayerName)을 조건으로 삼아, 각 선수의 점수 합계를 서로 다른 열로 한꺼번에 조회하는 쿼리는 다음과 같습니다.

mysql> select
-> SUM(CASE WHEN PlayerName='Maxwell' THEN PlayerScore END) AS 'MAXWELL TOTAL SCORE',
-> SUM(CASE WHEN PlayerName='Ricky' THEN PlayerScore END) AS 'RICKY TOTAL SCORE',
-> SUM(CASE WHEN PlayerName='David' THEN PlayerScore END) AS 'DAVID TOTAL SCORE'
-> from selectMultipleSumDemo;

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

+---------------------+-------------------+-------------------+
| MAXWELL TOTAL SCORE | RICKY TOTAL SCORE | DAVID TOTAL SCORE |
+---------------------+-------------------+-------------------+
| 236 | 265 | 121 |
+---------------------+-------------------+-------------------+
1 row in set (0.00 sec)

결과에서 볼 수 있듯이 Maxwell의 점수 합계는 236점(89 + 96 + 51), Ricky는 265점(98 + 78 + 89), David는 121점(56 + 65)으로, 세 개의 합계가 각각 별도의 열에 표시됩니다.

참고: NULL 처리와 GROUP BY 대안

조건에 맞는 행이 하나도 없으면 SUM은 NULL을 반환합니다. 이 경우 CASE 문에 ELSE 0을 추가하거나 COALESCE 함수를 함께 사용하면 0으로 표시할 수 있습니다.

SUM(CASE WHEN PlayerName='David' THEN PlayerScore ELSE 0 END) AS 'DAVID TOTAL SCORE'

또한 조건의 개수가 많다면 아래처럼 GROUP BY를 사용하는 방식이 더 간결할 수 있습니다.

SELECT PlayerName, SUM(PlayerScore) AS TOTAL_SCORE
FROM selectMultipleSumDemo
GROUP BY PlayerName;