Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การนับหลายเงื่อนไขแสดงผลในหลายคอลัมน์แถวเดียว MySQL

เมื่อต้องการนับจำนวนแถวตามเงื่อนไขหลายข้อพร้อมกัน และแสดงผลแต่ละเงื่อนไขในคอลัมน์แยกกัน (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 เป็นมาตรฐาน)
  • เพิ่ม/ลดเงื่อนไขง่าย