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

MySQL에서 COUNT() 함수 없이 조건별 다중 카운트 수행하는 방법

MySQL에서 조건별로 여러 개수를 동시에 집계해야 할 때, 굳이 COUNT() 함수를 사용하지 않아도 됩니다. SUM() 함수와 CASE 문을 조합하면 하나의 쿼리로 여러 조건의 카운트를 손쉽게 구할 수 있습니다. 이번 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.

1. 샘플 테이블 생성

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

mysql> create table DemoTable1485
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(20),
-> StudentSubject varchar(20)
-> );
Query OK, 0 rows affected (0.72 sec)

2. 데이터 삽입

INSERT 명령어로 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Chris','MySQL');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Robert','MongoDB');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Robert','MongoDB');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Chris','Java');
Query OK, 1 row affected (0.12 sec)

3. 전체 레코드 확인

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

mysql> select * from DemoTable1485;

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

+-----------+-------------+----------------+
| StudentId | StudentName | StudentSubject |
+-----------+-------------+----------------+
| 1 | Chris | MySQL |
| 2 | Robert | MongoDB |
| 3 | Robert | MongoDB |
| 4 | Chris | Java |
+-----------+-------------+----------------+
4 rows in set (0.00 sec)

4. COUNT() 없이 다중 카운트 쿼리 작성

다음은 COUNT() 메서드를 사용하지 않고 과목별로 학생 이름의 개수를 집계하는 쿼리입니다. 핵심 원리는 CASE 문으로 조건을 만족하면 1, 만족하지 않으면 0을 반환하고, 이를 SUM()으로 합산하는 것입니다.

mysql> select StudentSubject,
-> sum(case when StudentName = 'Chris' THEN 1 ELSE 0 END) Chris_Count,
-> sum(case when StudentName = 'Robert' THEN 1 ELSE 0 END) Robert_Count
-> from DemoTable1485
-> group by StudentSubject;

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

+----------------+-------------+--------------+
| StudentSubject | Chris_Count | Robert_Count |
+----------------+-------------+--------------+
| MySQL | 1 | 0 |
| MongoDB | 0 | 2 |
| Java | 1 | 0 |
+----------------+-------------+--------------+
3 rows in set (0.00 sec)

결과 해석

위 결과를 보면 MySQL 과목에는 Chris가 1명, MongoDB 과목에는 Robert가 2명, Java 과목에는 Chris가 1명 있는 것을 한눈에 확인할 수 있습니다. 이처럼 SUM(CASE WHEN ...) 패턴을 활용하면 GROUP BY 절과 함께 피벗(pivot) 형태의 조건부 집계를 간단하게 구현할 수 있으며, 여러 조건의 통계를 한 번의 쿼리로 처리할 수 있어 성능 면에서도 유리합니다.