개요
MySQL에서 하나의 컬럼에 대해 상태 값에 따라 합계(SUM)와 차감(SUBTRACTION)을 동시에 처리해야 하는 경우가 있습니다. 이럴 때 CASE 문을 활용하면 단일 쿼리로 조건부 집계를 손쉽게 구현할 수 있습니다. 조건에 따라 값을 그대로 더하거나 음수로 변환하여 빼는 방식입니다.
이번 글에서는 예제 테이블을 만들고 데이터를 삽입한 뒤, CASE 문을 사용해 조건별 합계와 차감을 한 번의 쿼리로 처리하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 Status와 Amount 두 개의 컬럼을 가진 테이블을 생성합니다.
mysql> create table DemoTable866(
Status varchar(100),
Amount int
);
Query OK, 0 rows affected (0.63 sec)
2. 샘플 데이터 삽입
INSERT 문을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable866 values('ACTIVE',50);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable866 values('INACTIVE',70);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable866 values('INACTIVE',20);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable866 values('ACTIVE',100);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable866 values('ACTIVE',200);
Query OK, 1 row affected (0.11 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable866;
실행 결과는 다음과 같습니다.
+----------+--------+
| Status | Amount |
+----------+--------+
| ACTIVE | 50 |
| INACTIVE | 70 |
| INACTIVE | 20 |
| ACTIVE | 100 |
| ACTIVE | 200 |
+----------+--------+
5 rows in set (0.00 sec)
4. CASE 문으로 조건부 SUM/차감 쿼리 작성
이제 핵심인 쿼리를 살펴보겠습니다. CASE 문 안에서 Status가 'ACTIVE'면 Amount를 그대로 반환하고, 'INACTIVE'면 -Amount(음수)를 반환합니다. 이렇게 하면 SUM 함수가 ACTIVE 금액은 더하고 INACTIVE 금액은 자동으로 빼게 됩니다.
mysql> select sum(CASE WHEN Status = 'ACTIVE' then Amount
WHEN Status = 'INACTIVE' then -Amount
END) AS RemainingAmount
from DemoTable866;
실행 결과는 다음과 같습니다.
+-----------------+
| RemainingAmount |
+-----------------+
| 260 |
+-----------------+
1 row in set (0.06 sec)
결과 분석
결과값 260은 다음과 같이 계산된 것입니다.
- ACTIVE 합계: 50 + 100 + 200 = 350
- INACTIVE 합계: 70 + 20 = 90
- 최종 잔액(RemainingAmount): 350 − 90 = 260
마무리
이처럼 CASE 문과 SUM 함수를 조합하면 별도의 서브쿼리나 여러 번의 쿼리 실행 없이, 단일 MySQL 쿼리만으로 조건에 따른 합계와 차감 연산을 한 번에 처리할 수 있습니다. 회계 잔액 계산, 포인트 적립/차감 집계 등 실무에서 다양하게 활용할 수 있는 유용한 패턴이니 꼭 기억해 두시기 바랍니다.