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

MySQL에서 여러 열의 조건별 COUNT를 한 번에 구하는 방법 (SUM + IF 활용)

MySQL에서 하나의 쿼리로 여러 열에 대한 조건부 COUNT를 동시에 구하고 싶다면, 집계 함수 SUM()IF()를 함께 사용하면 됩니다. 이 방법을 활용하면 각 조건마다 별도의 쿼리를 실행할 필요 없이 단 한 번의 조회로 원하는 결과를 얻을 수 있습니다.

1. 테이블 생성하기

먼저 예제로 사용할 테이블을 생성해 보겠습니다.

mysql> create table DemoTable
(
    FirstName varchar(100),
    LastName varchar(100)
);
Query OK, 0 rows affected (2.80 sec)

2. 샘플 데이터 삽입하기

INSERT 명령어를 사용해 테이블에 레코드를 추가합니다.

mysql> insert into DemoTable values('Adam','Smith');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable values('John','Smith');
Query OK, 1 row affected (0.36 sec)
mysql> insert into DemoTable values('John','Doe');
Query OK, 1 row affected (1.38 sec)
mysql> insert into DemoTable values('Bob','Doe');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Sam','Smith');
Query OK, 1 row affected (0.25 sec)

3. 전체 데이터 확인하기

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

mysql> select *from DemoTable;

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

+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| Adam      | Smith    |
| John      | Smith    |
| John      | Doe      |
| Bob       | Doe      |
| Sam       | Smith    |
+-----------+----------+
5 rows in set (0.00 sec)

4. 여러 열에 대한 다중 COUNT 쿼리 실행하기

이제 핵심인 쿼리입니다. SUM()과 IF()를 조합하여 FirstName이 'John'인 행의 개수와 LastName이 'Smith'인 행의 개수를 동시에 집계할 수 있습니다.

mysql> select sum(if(FirstName='John',1,0)) as John_Count,
sum(if(LastName='Smith',1,0)) as Smith_Count from DemoTable;

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

+------------+-------------+
| John_Count | Smith_Count |
+------------+-------------+
|         2 |            3 |
+------------+-------------+
1 row in set (0.00 sec)

동작 원리

IF(조건, 1, 0)은 조건이 참이면 1을, 거짓이면 0을 반환합니다. 따라서 FirstName이 'John'인 행은 2개('John Smith', 'John Doe')이므로 John_Count는 2가 되고, LastName이 'Smith'인 행은 3개('Adam Smith', 'John Smith', 'Sam Smith')이므로 Smith_Count는 3이 됩니다.

이처럼 SUM(IF()) 패턴을 활용하면 여러 개의 COUNT 서브쿼리를 작성하는 것보다 훨씬 간결하고 효율적으로 조건별 집계를 처리할 수 있습니다. MySQL 8.0 이상에서는 COUNT(CASE WHEN ... THEN 1 END) 또는 SUM(조건) 형태로도 동일한 결과를 얻을 수 있습니다.