Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 NULL로 표시되는 테이블 열에 부분합(누적합)을 추가하는 방법

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 단계에서 동일한 결과를 얻을 수도 있으니, 상황에 맞는 방법을 선택하시기 바랍니다.