MySQL-এ সংচयी যোগফল (running total / cumulative sum) ক্যালকুলেট করতে ইউজার-ডিফাইন্ড ভেরিয়েবল ব্যবহার করা ক্লাসিক পদ্ধতি। MySQL 8.0+ তে উইন্ডো ফাংশন SUM() OVER() ব্যবহার করা আরও ভালো।
পদ্ধতি ১: ইউজার ভেরিয়েবল (পুরানো ভার্সনেও কাজ করে)
CREATE TABLE accumulated_demo (value INT);
INSERT INTO accumulated_demo VALUES (10), (15), (20), (25), (45);
SET @running_total = 0;
SELECT value,
@running_total := @running_total + value AS accumulated_sum
FROM accumulated_demo;
ফলাফল
+-------+-----------------+
| value | accumulated_sum |
+-------+-----------------+
| 10 | 10 |
| 15 | 25 |
| 20 | 45 |
| 25 | 70 |
| 45 | 115 |
+-------+-----------------+
পদ্ধতি ২: উইন্ডো ফাংশন (MySQL 8.0+ / MariaDB 10.2+) — সুপারিশযোগ্য
SELECT value,
SUM(value) OVER (ORDER BY id ROWS UNBOUNDED PRECEDING) AS accumulated_sum
FROM accumulated_demo;
ফायदা: ভেরিয়েবল ম্যানেজমেন্ট লাগে না, কোড পরিষ্কার, অপ্টিমাইজড এক্সিকিউশন প্ল্যান।
পদ্ধতি ৩: সাবকোয়ারি (সaral, কিন্তু ধীর)
SELECT t1.value,
(SELECT SUM(t2.value) FROM accumulated_demo t2 WHERE t2.id <= t1.id) AS accumulated_sum
FROM accumulated_demo t1
ORDER BY t1.id;
পার্টিশন বাই গ্রুপিংসহ (উদাহরণ: ব্যবহারকারী অনুযায়ী)
CREATE TABLE user_scores (user_id INT, score INT, game_date DATE);
INSERT INTO user_scores VALUES
(1, 10, '2024-01-01'), (1, 20, '2024-01-02'), (1, 15, '2024-01-03'),
(2, 5, '2024-01-01'), (2, 25, '2024-01-02');
SELECT user_id, score, game_date,
SUM(score) OVER (PARTITION BY user_id ORDER BY game_date) AS running_total
FROM user_scores;
ফলাফল
+---------+-------+------------+---------------+
| user_id | score | game_date | running_total |
+---------+-------+------------+---------------+
| 1 | 10 | 2024-01-01 | 10 |
| 1 | 20 | 2024-01-02 | 30 |
| 1 | 15 | 2024-01-03 | 45 |
| 2 | 5 | 2024-01-01 | 5 |
| 2 | 25 | 2024-01-02 | 30 |
+---------+-------+------------+---------------+