MySQL에서 특정 열의 값이 NULL로 비어 있을 때, 다른 열의 값을 기준으로 누적 부분합(Subtotal)을 계산하여 채워 넣어야 하는 경우가 종종 있습니다. 이 글에서는 사용자 정의 변수(User Variable)와 UPDATE 문을 활용해 NULL로 남아 있는 열에 부분합을 손쉽게 추가하는 방법을 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Amount int,
-> SubTotal int
-> );
Query OK, 0 rows affected (0.65 sec)
DemoTable은 두 개의 열로 구성됩니다. Amount는 개별 금액을 저장하고, SubTotal에는 각 행까지의 누적 합계가 저장될 예정입니다.
2단계: 데이터 삽입
INSERT 명령을 사용해 Amount 값만 입력합니다. 이때 SubTotal 열에는 값을 지정하지 않았으므로 자동으로 NULL이 들어갑니다.
mysql> insert into DemoTable(Amount) values(50);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(Amount) values(60);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(Amount) values(70);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(Amount) values(80);
Query OK, 1 row affected (0.17 sec)
3단계: 현재 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+--------+----------+
| Amount | SubTotal |
+--------+----------+
| 50 | NULL |
| 60 | NULL |
| 70 | NULL |
| 80 | NULL |
+--------+----------+
4 rows in set (0.00 sec)
예상대로 SubTotal 열의 모든 값이 NULL로 표시됩니다. 이제 이 빈 열에 누적 부분합을 채워 넣어 보겠습니다.
4단계: 부분합 계산 쿼리 실행
핵심 아이디어는 사용자 정의 변수 @sum을 활용하는 것입니다. 먼저 변수를 0으로 초기화한 뒤, UPDATE 문이 각 행을 처리할 때마다 해당 행의 Amount 값을 더해 나가면 됩니다.
mysql> set @sum := 0;
Query OK, 0 rows affected (0.10 sec)
mysql> update DemoTable set SubTotal = (@sum := @sum + Amount);
Query OK, 4 rows affected (0.19 sec)
Rows matched: 4 Changed: 4 Warnings: 0
(@sum := @sum + Amount) 표현식은 변수 @sum에 현재 행의 Amount 값을 더한 결과를 다시 @sum에 할당하면서, 동시에 그 값을 SubTotal 열에 대입합니다. UPDATE 문은 기본적으로 위에서부터 순서대로 행을 처리하므로, 각 행에는 그 시점까지의 누적 합계가 저장됩니다.
참고: 누적 순서가 중요하다면 ORDER BY 절을 함께 사용해 처리 순서를 명시적으로 지정하는 것이 좋습니다. 예: UPDATE DemoTable SET SubTotal = (@sum := @sum + Amount) ORDER BY Amount;
5단계: 최종 결과 확인
테이블을 다시 조회해 업데이트가 제대로 적용되었는지 확인합니다.
mysql> select *from DemoTable;
출력 결과
+--------+----------+
| Amount | SubTotal |
+--------+----------+
| 50 | 50 |
| 60 | 110 |
| 70 | 180 |
| 80 | 260 |
+--------+----------+
4 rows in set (0.00 sec)
결과를 보면 SubTotal 열에 각 행까지의 누적 합계가 올바르게 계산되어 들어간 것을 확인할 수 있습니다. 즉, 50 → 110(50+60) → 180(50+60+70) → 260(50+60+70+80) 순으로 부분합이 채워졌습니다.
마무리
이처럼 MySQL에서는 사용자 정의 변수와 UPDATE 문을 조합하면 별도의 애플리케이션 로직 없이도 NULL로 비어 있는 열에 누적 부분합을 간단히 추가할 수 있습니다. 참고로 MySQL 8.0 이상을 사용한다면 윈도우 함수인 SUM() OVER()를 활용해 SELECT 단계에서 동일한 결과를 얻을 수도 있으니, 상황에 맞는 방법을 선택하시기 바랍니다.