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

MySQL에서 두 개의 조건으로 카운트를 집계하는 쿼리 작성 방법

MySQL에서 두 개의 조건으로 카운트 집계하기

MySQL에서 두 개의 서로 다른 조건을 기준으로 레코드 수를 집계하려면 CASE 문을 활용하는 것이 가장 효과적입니다. CASE 문은 조건에 따라 서로 다른 값을 반환할 수 있기 때문에, GROUP BY 절과 함께 사용하면 특정 조건을 만족하는 행만 골라 합산하는 조건부 집계를 간단하게 구현할 수 있습니다.

아래 예제에서는 학생 점수(StudentMarks)별로 레코드를 그룹화하고, 점수가 45점인 경우에는 유효 여부(isValid)가 1인 행만 카운트하며, 그 외의 점수는 모든 행을 카운트하는 방법을 단계별로 살펴보겠습니다.

1단계: 테이블 생성

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

mysql> create table DemoTable
    -> (
    -> StudentMarks int,
    -> isValid tinyint(1)
    -> );
Query OK, 0 rows affected (0.68 sec)

2단계: 데이터 삽입

insert 명령을 사용하여 테이블에 샘플 레코드를 삽입합니다.

mysql> insert into DemoTable values(45,0);
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable values(78,1);
Query OK, 1 row affected (0.26 sec)

mysql> insert into DemoTable values(45,1);
Query OK, 1 row affected (0.31 sec)

mysql> insert into DemoTable values(78,1);
Query OK, 1 row affected (0.22 sec)

mysql> insert into DemoTable values(45,0);
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable values(82,1);
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable values(62,1);
Query OK, 1 row affected (0.14 sec)

3단계: 전체 데이터 확인

select 문을 사용하여 테이블에 저장된 모든 레코드를 조회합니다.

mysql> select *from DemoTable;

출력 결과

+--------------+---------+
| StudentMarks | isValid |
+--------------+---------+
| 45           | 0       |
| 78           | 1       |
| 45           | 1       |
| 78           | 1       |
| 45           | 0       |
| 82           | 1       |
| 62           | 1       |
+--------------+---------+
7 rows in set (0.00 sec)

4단계: 두 개의 조건으로 카운트하는 쿼리

다음은 두 개의 개별 조건을 적용하여 카운트를 집계하는 쿼리입니다. 내부 CASE 문은 점수가 45점일 때 isValid 값이 1인 경우에만 1을 반환하고, 그렇지 않으면 0을 반환합니다. 반면 점수가 45가 아닌 경우에는 외부 CASE 문의 else 절에 따라 항상 1이 더해져 해당 점수의 모든 행이 카운트됩니다.

mysql> select StudentMarks,
    -> sum(case
    -> when StudentMarks=45
    -> then case when isValid = 1 then 1 else 0 end
    -> else 1 end
    -> ) AS Freq
    -> from DemoTable
    -> group by StudentMarks;

출력 결과

+--------------+------+
| StudentMarks | Freq |
+--------------+------+
| 45           | 1    |
| 78           | 2    |
| 82           | 1    |
| 62           | 1    |
+--------------+------+
4 rows in set (0.00 sec)

실행 결과를 보면 45점은 유효한(isValid=1) 레코드가 1건뿐이므로 Freq가 1로 집계되었고, 78점은 두 건 모두 유효하여 2로 집계된 것을 확인할 수 있습니다. 이처럼 CASE 문을 SUM 함수와 함께 사용하면 하나의 쿼리만으로 여러 조건을 동시에 처리하는 유연한 집계가 가능합니다.