ภาพรวม
ใช้ GROUP BY จัดกลุ่มแถวที่มีค่าเหมือนกัน และ COUNT() นับจำนวนแถวในแต่ละกลุ่ม แสดงผลในคอลัมน์ใหม่
ตัวอย่างสมบูรณ์
1. สร้างตารางและข้อมูล (มีชื่อซ้ำ)
CREATE TABLE DemoTable (Name VARCHAR(30));
INSERT INTO DemoTable VALUES ('Chris');
INSERT INTO DemoTable VALUES ('Robert');
INSERT INTO DemoTable VALUES ('Mike');
INSERT INTO DemoTable VALUES ('Robert');
INSERT INTO DemoTable VALUES ('Mike');
INSERT INTO DemoTable VALUES ('David');
2. ข้อมูลทั้งหมด
SELECT * FROM DemoTable;
+--------+
| Name |
+--------+
| Chris |
| Robert |
| Mike |
| Robert |
| Mike |
| David |
+--------+
3. GROUP BY + COUNT()
SELECT Name, COUNT(Name) AS NumberOfRowsPerName
FROM DemoTable
GROUP BY Name;
4. ผลลัพธ์
+--------+---------------------+
| Name | NumberOfRowsPerName |
+--------+---------------------+
| Chris | 1 |
| Robert | 2 |
| Mike | 2 |
| David | 1 |
+--------+---------------------+
รายละเอียด COUNT()
| รูปแบบ | นับอะไร | NULL |
|---|---|---|
| COUNT(*) | ทุกแถวในกลุ่ม | นับ |
| COUNT(column) | แถวที่ column ไม่ใช่ NULL | ไม่นับ |
| COUNT(DISTINCT column) | ค่าที่ไม่ซ้ำในกลุ่ม | ไม่นับ |
การประยุกต์ใช้
เรียงตามจำนวนมากไปน้อย
SELECT Name, COUNT(*) AS Cnt
FROM DemoTable
GROUP BY Name
ORDER BY Cnt DESC;
กรองกลุ่มที่มีมากกว่า 1 (HAVING)
SELECT Name, COUNT(*) AS Cnt
FROM DemoTable
GROUP BY Name
HAVING COUNT(*) > 1;
หลายคอลัมน์ (Multi-column Grouping)
SELECT Department, JobTitle, COUNT(*) AS EmpCount
FROM Employees
GROUP BY Department, JobTitle;
ใช้ WITH ROLLUP (เพิ่มแถวรวม)
SELECT Name, COUNT(*) AS Cnt
FROM DemoTable
GROUP BY Name WITH ROLLUP;
-- เพิ่มแถวสุดท้าย: NULL | 6 (Total)
ข้อควรระวัง
- คอลัมน์ใน SELECT ต้องอยู่ใน GROUP BY หรือเป็น Aggregate Function
- MySQL (ONLY_FULL_GROUP_BY mode) บังคับให้อbey กฎนี้เข้มงวด
- NULL ถูกจัดกลุ่มรวมกันเป็นกลุ่มเดียว
สรุป
SELECT col, COUNT(*) FROM table GROUP BY col - จัดกลุ่มและนับจำนวน แสดงในคอลัมน์ใหม่ (Alias ด้วย AS)