শর্তসাপেক্ষ এগ্রিগেশন: CASE WHEN WITH SUM()
MySQL-এ একই কলামের ভিন্ন ভিন্ন মানের জন্য পৃথক পৃথক গণনা (count) পাওয়ার জন্য CASE WHEN এক্সপ্রেশন SUM()-এর ভিতরে ব্যবহার করা হয়। এটি পিভট টেবিল (pivot table) তৈরি করার অনুরূপ ফলাফল দেয়।
উদাহরণ: প্রোডাক্ট রেটিংয়ের গণনা
টেবিল তৈরি:
CREATE TABLE DemoTable (
ProductName VARCHAR(100),
ProductRating ENUM('1','2','3')
);
INSERT INTO DemoTable VALUES
('Product-1', 3), ('Product-2', 1), ('Product-3', 2),
('Product-1', 2), ('Product-3', 3), ('Product-2', 2), ('Product-3', 3);
পিভট স্টাইলে কোয়ারি
SELECT
ProductName,
SUM(CASE WHEN ProductRating = 3 THEN 1 ELSE 0 END) AS Rating_3_Count,
SUM(CASE WHEN ProductRating = 2 THEN 1 ELSE 0 END) AS Rating_2_Count,
SUM(CASE WHEN ProductRating = 1 THEN 1 ELSE 0 END) AS Rating_1_Count
FROM DemoTable
GROUP BY ProductName;
আউটপুট:
+-------------+----------------+----------------+----------------+
| ProductName | Rating_3_Count | Rating_2_Count | Rating_1_Count |
+-------------+----------------+----------------+----------------+
| Product-1 | 1 | 1 | 0 |
| Product-2 | 0 | 1 | 1 |
| Product-3 | 2 | 1 | 0 |
+-------------+----------------+----------------+----------------+
ব্যাখ্যা
- প্রতিটি
CASEএকটি শর্ত যাচায় এবং মেললে ১, না মেললে ০ রিটার্ন করে। SUM()এই ১ এবং ০ গুলো যোগ করে গণনা করে।GROUP BY ProductNameপ্রতিটি প্রোডাক্টের জন্য পৃথক রো তৈরি করে।
আধুনিক বিকল্প (MySQL 8.0+)
SELECT
ProductName,
COUNT(*) FILTER (WHERE ProductRating = 3) AS Rating_3_Count,
COUNT(*) FILTER (WHERE ProductRating = 2) AS Rating_2_Count,
COUNT(*) FILTER (WHERE ProductRating = 1) AS Rating_1_Count
FROM DemoTable
GROUP BY ProductName;
FILTER ক্লজ আরও পঠনযোগ্য এবং স্ট্যান্ডার্ড SQL-সামঞ্জস্যপূর্ণ।