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

MySQL에서 CASE WHEN 문으로 조건별 카운트 수행하기

MySQL에서 CASE WHEN 문으로 조건별 카운트 수행하기

MySQL에서 특정 조건을 만족하는 행의 개수를 집계해야 할 때 CASE WHEN 문과 SUM() 또는 COUNT() 함수를 함께 사용하면 효율적으로 처리할 수 있습니다. 이번 글에서는 실제 예제를 통해 조건별 카운트 쿼리를 작성하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 테이블 생성

먼저 이름과 점수를 저장할 테이블을 생성합니다.

mysql> create table DemoTable1910
    (
    FirstName varchar(20),
    Marks int
    );
Query OK, 0 rows affected (0.00 sec)

2. 데이터 삽입

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

mysql> insert into DemoTable1910 values('Chris',45);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1910 values('David',85);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1910 values('Chris',55);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1910 values('Chris',98);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1910 values('David',98);
Query OK, 1 row affected (0.00 sec)

3. 전체 데이터 조회

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

mysql> select * from DemoTable1910;

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+-----------+-------+
| FirstName | Marks |
+-----------+-------+
| Chris | 45 |
| David | 85 |
| Chris | 55 |
| Chris | 98 |
| David | 98 |
+-----------+-------+
5 rows in set (0.00 sec)

4. CASE WHEN을 활용한 조건별 카운트 쿼리

이제 각 이름(FirstName)별로 점수가 45점인 행과 98점인 행의 개수를 집계해 보겠습니다.

mysql> select FirstName,
    sum(case when Marks=45 then 1 else 0 end),
    sum(case when Marks=98 then 1 else 0 end)
    from DemoTable1910
    group by FirstName;

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

+-----------+-------------------------------------------+-------------------------------------------+
| FirstName | sum(case when Marks=45 then 1 else 0 end) | sum(case when Marks=98 then 1 else 0 end) |
+-----------+-------------------------------------------+-------------------------------------------+
| Chris | 1 | 1 |
| David | 0 | 1 |
+-----------+-------------------------------------------+-------------------------------------------+
2 rows in set (0.00 sec)

쿼리 동작 원리

이 쿼리의 핵심은 case when Marks=45 then 1 else 0 end 부분입니다. 각 행을 검사하면서 점수(Marks)가 45이면 1을, 아니면 0을 반환합니다. 이후 SUM() 함수가 이 값들을 모두 더하므로, 결국 해당 조건을 만족하는 행의 개수, 즉 카운트 결과를 얻게 됩니다. GROUP BY로 이름별로 묶었기 때문에 사람마다 각 점수 구간의 개수를 한 번의 쿼리로 확인할 수 있습니다.

추가 팁: 별칭(Alias)으로 결과 가독성 높이기

컬럼 별칭을 지정하면 출력 결과를 더 읽기 쉽게 만들 수 있으며, COUNT() 함수를 사용해도 동일한 결과를 얻을 수 있습니다.

mysql> select FirstName,
    count(case when Marks=45 then 1 end) as Count_45,
    count(case when Marks=98 then 1 end) as Count_98
    from DemoTable1910
    group by FirstName;

CASE WHEN 내부에서 조건을 만족하지 않으면 NULL이 반환되고, COUNT()는 NULL을 제외하고 세기 때문에 위 쿼리 역시 조건별 카운트를 정확하게 수행합니다. 이처럼 CASE WHEN을 활용하면 하나의 쿼리로 여러 조건의 통계를 동시에 집계할 수 있어 보고서 작성이나 대시보드 데이터 추출에 매우 유용합니다.