MySQL에서 여러 개의 별도 쿼리를 실행하지 않고, 단 하나의 쿼리만으로 서로 다른 열에 있는 특정 값들의 개수를 한 번에 집계해야 하는 경우가 자주 있습니다. 이럴 때 SUM() 함수 안에 조건식을 넣으면 원하는 결과를 간단하게 얻을 수 있습니다. 아래 예제를 통해 그 방법을 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable760 (
ClientId int,
ClientId2 int
);
Query OK, 0 rows affected (0.79 sec)
2. 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable760 values(100,200);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable760 values(100,200);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable760 values(300,400);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable760 values(300,400);
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable760 values(100,200);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable760 values(100,200);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable760 values(400,500);
Query OK, 1 row affected (0.08 sec)
3. 전체 데이터 확인하기
SELECT 문을 사용하여 테이블에 저장된 모든 레코드를 조회합니다.
mysql> select *from DemoTable760;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+----------+-----------+
| ClientId | ClientId2 |
+----------+-----------+
| 100 | 200 |
| 100 | 200 |
| 300 | 400 |
| 300 | 400 |
| 100 | 200 |
| 100 | 200 |
| 400 | 500 |
+----------+-----------+
7 rows in set (0.00 sec)
4. 단일 쿼리로 여러 열의 값 개수 집계하기
여기서 핵심은 SUM() 함수 안에 비교 조건을 직접 넣는 것입니다. MySQL에서 조건식은 참일 때 1, 거짓일 때 0을 반환하므로, SUM()으로 이 값들을 모두 더하면 해당 조건을 만족하는 행의 개수가 됩니다. 이를 활용하면 여러 쿼리를 하나로 합친 것과 같은 효과를 낼 수 있습니다.
mysql> select sum(ClientId=100) AS ClientId1,sum(ClientId2=200) AS ClientId2 from DemoTable760;
실행 결과는 다음과 같습니다.
+-----------+-----------+
| ClientId1 | ClientId2 |
+-----------+-----------+
| 4 | 4 |
+-----------+-----------+
1 row in set (0.00 sec)
결과를 보면 ClientId 열에서 값이 100인 행은 총 4개, ClientId2 열에서 값이 200인 행 역시 총 4개임을 단 한 번의 쿼리로 확인할 수 있습니다.
참고: 다른 대체 방법
동일한 결과는 CASE WHEN 문을 사용해서도 얻을 수 있습니다. 예를 들어 sum(CASE WHEN ClientId=100 THEN 1 ELSE 0 END)처럼 작성하면 가독성을 높일 수 있으며, COUNT(IF(조건, 1, NULL)) 형태로 작성하는 방법도 있습니다. 상황에 맞게 선택하여 사용하면 됩니다.