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

MySQL에서 특정 값 기준으로 COUNT 집계하는 방법

MySQL에서 값 기준으로 카운트 조회하기

MySQL에서는 COUNT() 함수를 사용해 전체 레코드 수뿐만 아니라 특정 값에 해당하는 레코드 수도 함께 집계할 수 있습니다. 핵심은 IF() 함수를 COUNT() 내부에 조합하는 것입니다. 이번 글에서는 데모 테이블을 만들고, 값 조건별로 개수를 세는 방법을 단계별로 살펴보겠습니다.

1. 데모 테이블 생성

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

mysql> create table countValueDemo
   -> (
   -> ShippingDatetime datetime,
   -> FirstValue int,
   -> SecondValue int
   -> );
Query OK, 0 rows affected (1.35 sec)

테이블에는 날짜(datetime) 컬럼과 두 개의 정수(int) 컬럼이 포함되어 있습니다.

2. 샘플 데이터 삽입

INSERT 명령으로 몇 개의 레코드를 추가합니다. 일부러 NULL 값이 포함된 행도 넣어서, COUNT가 NULL을 어떻게 처리하는지 확인할 수 있도록 했습니다.

mysql> insert into countValueDemo values('2019-01-23',1,2);
Query OK, 1 row affected (0.24 sec)
mysql> insert into countValueDemo values('2017-02-21',NULL,2);
Query OK, 1 row affected (0.13 sec)
mysql> insert into countValueDemo values('2016-04-12',1,NULL);
Query OK, 1 row affected (0.19 sec)

3. 저장된 데이터 확인

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

mysql> select *from countValueDemo;

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

+---------------------+------------+-------------+
| ShippingDatetime    | FirstValue | SecondValue |
+---------------------+------------+-------------+
| 2019-01-23 00:00:00 |          1 |           2 |
| 2017-02-21 00:00:00 |       NULL |           2 |
| 2016-04-12 00:00:00 |          1 |        NULL |
+---------------------+------------+-------------+
3 rows in set (0.00 sec)

4. 값 조건별로 개수 집계하기

이제 핵심 쿼리입니다. COUNT(*)로 전체 행 수를 구하고, 동시에 IF() 함수를 활용해 FirstValue가 1인 행과 SecondValue가 2인 행의 개수를 각각 집계합니다.

mysql> SELECT ShippingDatetime,
   -> COUNT(*),
   -> COUNT( IF( FirstValue = 1, 1, NULL ) ),
   -> COUNT( IF( SecondValue = 2, 1, NULL ) )
   -> FROM countValueDemo;

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

+---------------------+----------+----------------------------------------+-----------------------------------------+
| ShippingDatetime    | COUNT(*) | COUNT( IF( FirstValue = 1, 1, NULL ) ) | COUNT( IF( SecondValue = 2, 1, NULL ) ) |
+---------------------+----------+----------------------------------------+-----------------------------------------+
| 2019-01-23 00:00:00 |        3 |                                      2 |                                       2 |
+---------------------+----------+----------------------------------------+-----------------------------------------+
1 row in set (0.08 sec)

결과 해석

  • COUNT(*): 3 — 테이블의 전체 행 수입니다.
  • COUNT(IF(FirstValue = 1, 1, NULL)): 2 — FirstValue가 1인 행은 2개입니다(NULL인 행은 제외).
  • COUNT(IF(SecondValue = 2, 1, NULL)): 2 — SecondValue가 2인 행 역시 2개입니다.

여기서 중요한 포인트는 COUNT() 함수가 NULL 값은 세지 않는다는 점입니다. 따라서 IF() 함수에서 조건을 만족하면 1을 반환하고, 만족하지 않으면 NULL을 반환하도록 작성하면 원하는 값만 정확하게 카운트할 수 있습니다. 이 방식은 CASE WHEN 절을 사용하는 것과 동일한 효과를 내며, 하나의 쿼리로 여러 조건의 집계 결과를 한 번에 얻을 수 있어 보고서나 통계 조회에 매우 유용합니다.