কম্পিউটার টিউটোরিয়াল

MySQL-এ রানিং টোটাল (Accumulated/Sum) ক্যালকুলেট করা

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            |
+---------+-------+------------+---------------+
  1. MySQL-এ ORDER BY DESC LIMIT দিয়ে বটম N রেকর্ড বের করা

  2. MySQL-এ সেশন ভেরিয়েবল দিয়ে রানিং টোটাল (cumulative sum) হিসাব করা

  3. শর্ত অনুযায়ী MySQL-এ কলামের SUM করা

  4. MySQL-এ DISTINCT কলাম থেকে গড় (AVG) বের করা