MySQL에서 특정 필드 값에 따라 다른 열의 값들을 합산하려면 집계 함수 SUM()과 CASE문을 함께 사용하면 됩니다. CASE문은 조건에 따라 합산할 대상 열을 선택해 주는 역할을 하며, 이를 통해 조건부 합계를 손쉽게 계산할 수 있습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다. 고객 여부(isValidCustomer)에 따라 가격(Price) 또는 최종 가격(FinalPrice) 중 어떤 값을 합산할지 결정하는 구조입니다.
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Price int,
isValidCustomer boolean,
FinalPrice int
);
Query OK, 0 rows affected (0.23 sec)2. 샘플 데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable(Price,isValidCustomer,FinalPrice) values(20,false,40); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable(Price,isValidCustomer,FinalPrice) values(45,true,10); Query OK, 1 row affected (0.16 sec) mysql> insert into DemoTable(Price,isValidCustomer,FinalPrice) values(89,true,50); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable(Price,isValidCustomer,FinalPrice) values(200,false,100); Query OK, 1 row affected (0.06 sec)
3. 저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+----+-------+-----------------+------------+ | Id | Price | isValidCustomer | FinalPrice | +----+-------+-----------------+------------+ | 1 | 20 | 0 | 40 | | 2 | 45 | 1 | 10 | | 3 | 89 | 1 | 50 | | 4 | 200 | 0 | 100 | +----+-------+-----------------+------------+ 4 rows in set (0.00 sec)
4. 필드 값 기준으로 조건부 합산하기
다음은 MySQL에서 필드 값을 기준으로 합산하는 쿼리입니다. 여기서는 isValidCustomer가 TRUE(1)인 경우 Price를 더하고, FALSE(0)인 경우 FinalPrice를 더하도록 CASE문을 구성했습니다.
mysql> select sum(case when isValidCustomer=true then Price else FinalPrice end) as TotalPrice from DemoTable;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+------------+ | TotalPrice | +------------+ | 274 | +------------+ 1 row in set (0.00 sec)
결과 분석
합계 274는 다음과 같이 계산된 값입니다.
- Id 1 (isValidCustomer = 0): FinalPrice 40 합산
- Id 2 (isValidCustomer = 1): Price 45 합산
- Id 3 (isValidCustomer = 1): Price 89 합산
- Id 4 (isValidCustomer = 0): FinalPrice 100 합산
즉, 40 + 45 + 89 + 100 = 274가 됩니다. 이처럼 SUM()과 CASE문을 조합하면 하나의 쿼리로 조건별로 서로 다른 열의 값을 유연하게 합산할 수 있으며, 복잡한 통계 조회나 보고서 작성 시 매우 유용하게 활용됩니다.