MySQL에서 열의 값을 이전 행의 값과 차례대로 더해 누적 합계(cumulative sum)를 구하려면 세션 변수(session variable)를 활용하는 방법이 가장 간단합니다. 세션 변수는 @ 기호로 선언되며, 한 세션 안에서 값이 계속 유지되기 때문에 각 행마다 이전 결과를 참조할 수 있습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable809(Price int); Query OK, 0 rows affected (0.53 sec)
2. 데이터 삽입하기
INSERT 문으로 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable809 values(40); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable809 values(50); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable809 values(60); Query OK, 1 row affected (0.12 sec)
3. 전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable809;
실행 결과는 다음과 같습니다.
+-------+ | Price | +-------+ | 40 | | 50 | | 60 | +-------+ 3 rows in set (0.00 sec)
4. 이전 값과 누적 합산하는 쿼리
아래 쿼리는 세션 변수 @currentSum에 각 행의 Price 값을 더해가며 누적 합계를 계산합니다.
mysql> select @currentSum:=@currentSum+Price from DemoTable809;
실행 결과는 다음과 같습니다.
+--------------------------------+ | @currentSum:=@currentSum+Price | +--------------------------------+ | 40 | | 90 | | 150 | +--------------------------------+ 3 rows in set (0.00 sec)
결과를 보면 첫 번째 행은 40, 두 번째 행은 40+50=90, 세 번째 행은 90+60=150처럼 이전 값에 현재 값을 순차적으로 더한 누적 합계가 출력됩니다.
참고: 변수 초기화와 윈도우 함수 대안
세션 변수에 이전 실행의 값이 남아 있을 수 있으므로, 쿼리를 실행하기 전에 다음과 같이 초기화하는 것이 안전합니다.
mysql> set @currentSum := 0; mysql> select @currentSum := @currentSum + Price AS cumulative_sum from DemoTable809;
또한 MySQL 8.0 이상 버전에서는 윈도우 함수를 사용해 더 깔끔하고 성능 좋게 누적 합계를 구할 수 있습니다.
mysql> select Price, sum(Price) over (order by Price) AS cumulative_sum from DemoTable809;