เมื่อต้องการนับจำนวนแถวตามเงื่อนไขหลายข้อพร้อมกัน และแสดงผลแต่ละเงื่อนไขในคอลัมน์แยกกัน (Pivot/Transpose) ใช้ SUM() ร่วมกับเงื่อนไข Boolean (MySQL แปลง TRUE=1, FALSE=0)
ตัวอย่างการใช้งาน
สร้างตารางสีที่ชอบ:
mysql> CREATE TABLE DemoTable1452 (FavouriteColor VARCHAR(50));
เพิ่มข้อมูล:
mysql> INSERT INTO DemoTable1452 VALUES ('Red'), ('Yellow'), ('Yellow'), ('Yellow'), ('Blue'), ('Blue'), ('Red');
ดูข้อมูล:
mysql> SELECT * FROM DemoTable1452; +----------------+ | FavouriteColor | +----------------+ | Red | | Yellow | | Yellow | | Yellow | | Blue | | Blue | | Red | +----------------+
นับแต่ละสี แสดงในคอลัมน์แยกกัน (Single Row):
mysql> SELECT
-> SUM(FavouriteColor = 'Red') AS NumberOfRedColor,
-> SUM(FavouriteColor = 'Yellow') AS NumberOfYellowColor,
-> SUM(FavouriteColor = 'Blue') AS NumberOfBlueColor
-> FROM DemoTable1452;
ผลลัพธ์:
+------------------+---------------------+-------------------+ | NumberOfRedColor | NumberOfYellowColor | NumberOfBlueColor | +------------------+---------------------+-------------------+ | 2 | 3 | 2 | +------------------+---------------------+-------------------+
หลักการทำงาน
FavouriteColor = 'Red'คืนค่า 1 (TRUE) หรือ 0 (FALSE) ต่อแถว- SUM() รวมค่า 1/0 = จำนวนแถวที่ตรงเงื่อนไข
- ไม่ต้องใช้ GROUP BY เพราะต้องการผลรวมทั้งตาราง (Single Row)
วิธีทางเลือก: CASE WHEN (มาตรฐาน SQL, อ่านง่ายกว่า)
SELECT
SUM(CASE WHEN FavouriteColor = 'Red' THEN 1 ELSE 0 END) AS NumberOfRedColor,
SUM(CASE WHEN FavouriteColor = 'Yellow' THEN 1 ELSE 0 END) AS NumberOfYellowColor,
SUM(CASE WHEN FavouriteColor = 'Blue' THEN 1 ELSE 0 END) AS NumberOfBlueColor
FROM DemoTable1452;
การประยุกต์ใช้: Conditional Aggregation (Pivot Table)
-- นับสถานะออเดอร์ต่อลูกค้า
SELECT CustomerId,
SUM(CASE WHEN Status = 'Pending' THEN 1 ELSE 0 END) AS Pending,
SUM(CASE WHEN Status = 'Shipped' THEN 1 ELSE 0 END) AS Shipped,
SUM(CASE WHEN Status = 'Delivered' THEN 1 ELSE 0 END) AS Delivered,
SUM(CASE WHEN Status = 'Cancelled' THEN 1 ELSE 0 END) AS Cancelled
FROM Orders
GROUP BY CustomerId;
ข้อดีของวิธีนี้
- Query เดียว ได้หลายคอลัมน์นับ (Efficient)
- ไม่ต้อง Self-Join หรือ Subquery หลายตัว
- ทำงานได้กับทุก Database (CASE WHEN เป็นมาตรฐาน)
- เพิ่ม/ลดเงื่อนไขง่าย