একই কোয়েরিতে একাধিক শর্ত অনুযায়ী কাউন্ট করতে SUM(CASE WHEN ... THEN 1 ELSE 0 END) প্যাটার্ন ব্যবহার করা হয়। এটাকে Conditional Aggregation বলা হয়।
টেবিল ও ডেটা তৈরি
mysql> CREATE TABLE DemoTable1910 (
FirstName VARCHAR(20),
Marks INT
);
mysql> INSERT INTO DemoTable1910 VALUES
('Chris', 45), ('David', 85), ('Chris', 55), ('Chris', 98), ('David', 98);
ডেটা যাচাই
mysql> SELECT * FROM DemoTable1910;
+-----------+-------+ | FirstName | Marks | +-----------+-------+ | Chris | 45 | | David | 85 | | Chris | 55 | | Chris | 98 | | David | 98 | +-----------+-------+
Conditional Aggregation কোয়েরি
mysql> SELECT FirstName,
SUM(CASE WHEN Marks = 45 THEN 1 ELSE 0 END) AS cnt_45,
SUM(CASE WHEN Marks = 98 THEN 1 ELSE 0 END) AS cnt_98
FROM DemoTable1910
GROUP BY FirstName;
আউটপুট:
+-----------+--------+--------+ | FirstName | cnt_45 | cnt_98 | +-----------+--------+--------+ | Chris | 1 | 1 | | David | 0 | 1 | +-----------+--------+--------+
কেন COUNT() না ব্যবহার করে SUM()?
COUNT(expr)NULL নয় এমন expr গুনে।CASE WHEN ... THEN 1 ELSE NULL ENDলিখলেCOUNT()ও কাজ করত, কিন্তুSUM(CASE ... THEN 1 ELSE 0 END)সবচেয়ে স্পষ্ট ও পোর্টেবল।
MySQL 8.0+ এ FILTER ক্লজ (বিকল্প)
SELECT FirstName,
COUNT(*) FILTER (WHERE Marks = 45) AS cnt_45,
COUNT(*) FILTER (WHERE Marks = 98) AS cnt_98
FROM DemoTable1910
GROUP BY FirstName;
নোট: MySQL 8.0 এ FILTER ক্লজ এখনও সমর্থিত নয়; PostgreSQL/SQL Server-এ আছে। MySQL-এ SUM(CASE...) স্ট্র্যান্ডার্ড।
ব্যবহারিক টিপস
- শর্তগুলো মিউচুয়ালি এক্সক্লूसিভ হলে
SUM(CASE ...)দ্রুত। - ইন্ডেক্স
(FirstName, Marks)থাকলে গ্রুপিং ও ফিল্টারিং দ্রুত হবে।