MySQL에서 특정 방식으로 단일 열의 값을 합산하려면 집계 함수 SUM()과 윈도우 함수인 OVER 절을 함께 사용합니다. OVER 절 안에 ORDER BY를 지정하면 각 행 기준으로 첫 번째 행부터 현재 행까지의 누적 합계(running total)가 계산됩니다.
1단계 — 테이블 생성하기
먼저 데모용 테이블을 생성합니다.
mysql> create table DemoTable ( CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY, CustomerValue int ); Query OK, 0 rows affected (0.64 sec)
2단계 — 데이터 삽입하기
insert 명령어를 사용해 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable(CustomerValue) values(10); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable(CustomerValue) values(20); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable(CustomerValue) values(30); Query OK, 1 row affected (0.23 sec) mysql> insert into DemoTable(CustomerValue) values(40); Query OK, 1 row affected (0.14 sec)
3단계 — 전체 레코드 조회하기
select 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+------------+---------------+ | CustomerId | CustomerValue | +------------+---------------+ | 1 | 10 | | 2 | 20 | | 3 | 30 | | 4 | 40 | +------------+---------------+ 4 rows in set (0.00 sec)
4단계 — 누적 합계 쿼리 실행하기
다음은 SUM() OVER를 사용해 특정 방식으로 단일 열의 값을 합산하는 쿼리입니다. ORDER BY CustomerId를 지정했기 때문에 고객 ID 순서대로 값이 차례로 누적되어 더해집니다.
mysql> select CustomerId, SUM(CustomerValue) OVER (ORDER BY CustomerId) SpecificSum from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+------------+-------------+ | CustomerId | SpecificSum | +------------+-------------+ | 1 | 10 | | 2 | 30 | | 3 | 60 | | 4 | 100 | +------------+-------------+ 4 rows in set (0.00 sec)
결과 해석
출력 결과에서 각 행의 SpecificSum 값이 어떻게 계산되었는지 살펴보겠습니다.
- CustomerId 1 → 10 (첫 번째 값 그대로)
- CustomerId 2 → 10 + 20 = 30
- CustomerId 3 → 10 + 20 + 30 = 60
- CustomerId 4 → 10 + 20 + 30 + 40 = 100
이처럼 SUM() OVER (ORDER BY ...) 구문을 활용하면 단순한 전체 합계가 아니라, 지정한 정렬 순서에 따라 증가하는 누적 합계를 손쉽게 구할 수 있습니다. 참고로 윈도우 함수 기능은 MySQL 8.0 이상 버전에서 지원되므로, 하위 버전을 사용 중이라면 먼저 버전을 확인해야 합니다.