MySQL에서 SELECT 필드별 조건 처리 방법
MySQL에서 집계 함수 내부의 특정 필드에 조건을 적용해야 할 때는 WHERE 절 대신 CASE 문을 사용하는 것이 효과적입니다. WHERE 절은 행 전체를 필터링하지만, CASE 문은 SELECT 목록 안에서 각 필드(열)마다 개별적인 조건 로직을 적용할 수 있기 때문입니다.
아래 예제를 통해 실제 동작 과정을 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 세 개의 정수형 컬럼을 가진 테이블을 생성합니다.
mysql> create table DemoTable1988
(
Value1 int,
Value2 int,
Price int
);
Query OK, 0 rows affected (0.64 sec)
2단계: 샘플 데이터 삽입
INSERT 명령어를 사용해 테스트용 레코드를 추가합니다.
mysql> insert into DemoTable1988 values(10,7,500);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1988 values(7,9,400);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1988 values(8,7,200);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1988 values(7,4,300);
Query OK, 1 row affected (0.16 sec)
3단계: 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회합니다.
mysql> select * from DemoTable1988;
실행 결과는 다음과 같습니다.
+--------+--------+-------+
| Value1 | Value2 | Price |
+--------+--------+-------+
| 10 | 7 | 500 |
| 7 | 9 | 400 |
| 8 | 7 | 200 |
| 7 | 4 | 300 |
+--------+--------+-------+
4 rows in set (0.00 sec)
4단계: CASE 문으로 필드별 조건 쿼리 작성
이제 핵심 부분입니다. 아래 쿼리는 SUM 함수와 CASE 문을 결합하여, Value2가 7인 행의 Price 합계에서 Value1이 7인 행의 Price 합계를 뺀 결과를 계산합니다.
mysql> select sum( case when Value2=7 then Price else 0 end)-
sum( case when Value1=7 then Price else 0 end) as Result
from DemoTable1988;
실행 결과는 다음과 같습니다.
+--------+
| Result |
+--------+
| 0 |
+--------+
1 row in set (0.23 sec)
결과 해석
위 쿼리의 계산 과정은 다음과 같습니다.
- 첫 번째 SUM: Value2 = 7인 행(500, 200)의 Price 합계 → 700
- 두 번째 SUM: Value1 = 7인 행(400, 300)의 Price 합계 → 700
- 최종 결과: 700 − 700 = 0
이처럼 CASE 문을 활용하면 하나의 쿼리 안에서 여러 필드에 서로 다른 조건을 독립적으로 적용할 수 있어, WHERE 절만으로는 구현하기 어려운 복잡한 조건부 집계도 손쉽게 처리할 수 있습니다.