คำตอบ: ใช่ ใช้ COUNT(*) กับ GROUP BY
ไม่ต้องเขียน DISTINCT แยก ใช้ GROUP BY column จัดกลุ่มค่าที่เหมือนกัน แล้ว COUNT(*) นับจำนวนในแต่ละกลุ่ม
ตัวอย่างสมบูรณ์
1. สร้างตารางและข้อมูล (ปีซ้ำกัน)
CREATE TABLE DemoTable1425 (JoiningYear INT);
INSERT INTO DemoTable1425 VALUES (2000);
INSERT INTO DemoTable1425 VALUES (2010);
INSERT INTO DemoTable1425 VALUES (2015);
INSERT INTO DemoTable1425 VALUES (2000);
INSERT INTO DemoTable1425 VALUES (2010);
INSERT INTO DemoTable1425 VALUES (2000);
INSERT INTO DemoTable1425 VALUES (2010);
2. ข้อมูลทั้งหมด
SELECT * FROM DemoTable1425;
+-------------+
| JoiningYear |
+-------------+
| 2000 |
| 2010 |
| 2015 |
| 2000 |
| 2010 |
| 2000 |
| 2010 |
+-------------+
3. Query: นับจำนวนแต่ละปี
SELECT JoiningYear, COUNT(*) AS Count
FROM DemoTable1425
GROUP BY JoiningYear;
4. ผลลัพธ์
+-------------+-------+
| JoiningYear | Count |
+-------------+-------+
| 2000 | 3 |
| 2010 | 3 |
| 2015 | 1 |
+-------------+-------+
การทำงาน
GROUP BY JoiningYear- จัดกลุ่มแถวที่ Year เหมือนกันCOUNT(*)- นับแถวในแต่ละกลุ่ม- คอลัมน์
JoiningYearใน SELECT ต้องอยู่ใน GROUP BY (MySQL Strict Mode)
ตัวเลือกเพิ่มเติม
เรียงตามจำนวนมากไปน้อย
SELECT JoiningYear, COUNT(*) AS Cnt
FROM DemoTable1425
GROUP BY JoiningYear
ORDER BY Cnt DESC;
กรองเฉพาะที่มากกว่า 1 (Duplicate)
SELECT JoiningYear, COUNT(*) AS Cnt
FROM DemoTable1425
GROUP BY JoiningYear
HAVING COUNT(*) > 1;
หลายคอลัมน์ (Composite Group)
SELECT Department, Year, COUNT(*) AS Cnt
FROM Employees
GROUP BY Department, Year;
ฟังก์ชัน Aggregate อื่นใน GROUP BY
| ฟังก์ชัน | คำอธิบาย |
|---|---|
| COUNT(*) | นับแถวทั้งหมดในกลุ่ม |
| COUNT(col) | นับแถวที่ col ไม่ใช่ NULL |
| SUM(col) | ผลรวม |
| AVG(col) | ค่าเฉลี่ย |
| MIN/MAX(col) | ค่าต่ำสุด/สูงสุด |
| GROUP_CONCAT(col) | รวมค่าเป็นสตริง |
สรุป
ใช้ SELECT column, COUNT(*) FROM table GROUP BY column เพื่อดูจำนวนครั้งของแต่ละค่าที่ไม่ซ้ำ ไม่ต้องใช้ DISTINCT แยก