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 함수와 함께 사용하면 하나의 쿼리만으로 여러 조건을 동시에 처리하는 유연한 집계가 가능합니다.