Conditional Counting: นับค่าเฉพาะที่รู้จักล่วงหน้า
ใช้ SUM(condition) โดย MySQL แปลง Boolean เป็น 1 (True) / 0 (False) อัตโนมัติ
ตัวอย่าง: นับชื่อเฉพาะ John, Robert, Sam, Mike
CREATE TABLE DemoTable636 (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentFirstName VARCHAR(100)
);
INSERT INTO DemoTable636(StudentFirstName) VALUES
('John'), ('Robert'), ('Robert'), ('Sam'), ('Mike'), ('John'), ('Robert');
Query: นับแต่ละชื่อแยกกัน
SELECT
SUM(StudentFirstName = 'John') AS JOHN_COUNT,
SUM(StudentFirstName = 'Robert') AS ROBERT_COUNT,
SUM(StudentFirstName = 'Sam') AS SAM_COUNT,
SUM(StudentFirstName = 'Mike') AS MIKE_COUNT
FROM DemoTable636;
ผลลัพธ์:
+------------+--------------+-----------+------------+
| JOHN_COUNT | ROBERT_COUNT | SAM_COUNT | MIKE_COUNT |
+------------+--------------+-----------+------------+
| 2 | 3 | 1 | 1 |
+------------+--------------+-----------+------------+
เทคนิค: Boolean Arithmetic ใน MySQL
TRUE = 1,FALSE = 0condition1 + condition2= OR Logic (นับรวม)condition1 * condition2= AND Logic (นับที่ตรงทั้งคู่)
ตัวอย่าง: นับ John หรือ Robert (OR)
SELECT
SUM(StudentFirstName = 'John' OR StudentFirstName = 'Robert') AS john_or_robert
FROM DemoTable636; -- 5
ตัวอย่าง: นับ John และ Age > 20 (AND) - ต้องมี Age Column
SELECT
SUM(StudentFirstName = 'John' AND StudentAge > 20) AS john_adult
FROM DemoTable636;
เปรียบเทียบวิธีนับ
| Method | Query | เหมาะสำหรับ | Performance |
|---|---|---|---|
| SUM(Boolean) | SUM(col = 'val') | Known Values, Pivot Table | 🟢 เร็ว (Single Scan) |
| COUNT(CASE) | COUNT(CASE WHEN col='val' THEN 1 END) | Standard SQL, Complex Cond | 🟢 เร็ว |
| GROUP BY | GROUP BY col, COUNT(*) | Unknown Values, All Values | 🟡 ต้อง Sort/Hash |
| COUNT(*) FILTER | COUNT(*) FILTER (WHERE col='val') | PostgreSQL, MySQL 8.0.2+ | 🟢 เร็ว |
MySQL 8.0.2+: COUNT(*) FILTER (Standard SQL)
SELECT
COUNT(*) FILTER (WHERE StudentFirstName = 'John') AS JOHN_COUNT,
COUNT(*) FILTER (WHERE StudentFirstName = 'Robert') AS ROBERT_COUNT,
COUNT(*) FILTER (WHERE StudentFirstName = 'Sam') AS SAM_COUNT,
COUNT(*) FILTER (WHERE StudentFirstName = 'Mike') AS MIKE_COUNT
FROM DemoTable636;
Dynamic Pivot (Unknown Values) - Prepared Statement
-- ต้องใช้ Dynamic SQL ใน Stored Procedure
-- หรือ Application Layer สร้าง Query