MySQL에서 긍정(양수) 투표와 부정(음수) 투표의 개수를 각각 집계하려면 CASE 문과 집계 함수인 SUM()을 함께 사용하면 됩니다. 이 방법은 조건에 따라 값을 분류한 뒤 합산하는 방식으로, 하나의 쿼리로 두 가지 결과를 동시에 얻을 수 있어 매우 효율적입니다.
1. 예제 테이블 생성하기
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Vote int
);
Query OK, 0 rows affected (1.70 sec)
Id는 자동 증가되는 기본키이고, Vote 컬럼에는 투표 값(양수 또는 음수)이 저장됩니다.
2. 샘플 데이터 삽입하기
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable(Vote) values(-10); Query OK, 1 row affected (0.20 sec) mysql> insert into DemoTable(Vote) values(100); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable(Vote) values(45); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable(Vote) values(-6); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable(Vote) values(-1000); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable(Vote) values(450); Query OK, 1 row affected (0.14 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 전체 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Vote | +----+-------+ | 1 | -10 | | 2 | 100 | | 3 | 45 | | 4 | -6 | | 5 | -1000 | | 6 | 450 | +----+-------+ 6 rows in set (0.00 sec)
총 6개의 레코드가 있으며, 그중 양수는 3개(-10 제외한 100, 45, 450), 음수도 3개(-10, -6, -1000)입니다.
4. 긍정/부정 투표 수를 집계하는 쿼리
다음은 CASE 문과 SUM() 함수를 활용해 긍정 투표와 부정 투표의 개수를 한 번에 계산하는 쿼리입니다.
mysql> select sum(case when Vote > 0 then 1 else 0 end) as Number_Of_Positive_Votes, sum(case when Vote < 0 then 1 else 0 end) as Number_Of_Negative_Votes from DemoTable;
실행 결과는 다음과 같습니다.
+--------------------------+--------------------------+ | Number_Of_Positive_Votes | Number_Of_Negative_Votes | +--------------------------+--------------------------+ | 3 | 3 | +--------------------------+--------------------------+ 1 row in set (0.00 sec)
쿼리 동작 원리
이 쿼리의 핵심은 CASE 문의 조건 평가 방식입니다.
긍정 투표 집계: Vote > 0 조건이 참이면 1을 반환하고, 거짓이면 0을 반환합니다. SUM()이 이 값들을 모두 더하면 조건을 만족하는 행의 개수, 즉 양수 투표의 개수가 됩니다.
부정 투표 집계: 마찬가지로 Vote < 0 조건이 참일 때만 1을 반환하므로, 음수 투표의 개수가 집계됩니다.
만약 0인 투표도 별도로 세고 싶다면 Vote = 0 조건을 추가하거나, ELSE 절을 활용해 세 번째 카테고리를 만들면 됩니다. 이처럼 CASE 문과 SUM()의 조합은 조건부 집계(Conditional Aggregation)의 대표적인 패턴으로, 다양한 통계 쿼리에서 폭넓게 활용할 수 있습니다.