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

หาค่าเฉลี่ยของค่าซ้ำใน MySQL ใช้ HAVING กับ AVG() แทน WHERE

เมื่อต้องการกรองกลุ่มข้อมูลตามค่าเฉลี่ย (Aggregate) ต้องใช้ HAVING ไม่ใช่ WHERE เพราะ WHERE ทำงานก่อน GROUP BY ในขณะที่ HAVING ทำงานหลัง GROUP BY

ตัวอย่างการใช้งาน

สร้างตารางคะแนน (มีชื่อซ้ำ):

mysql> create table DemoTable1338 (Name varchar(10), Score int);
mysql> insert into DemoTable1338 values('Chris',8),('Bob',4),('Bob',9),('Chris',6),('David',5),('David',7);

ข้อมูลทั้งหมด:

+-------+-------+
| Name  | Score |
+-------+-------+
| Chris | 8     |
| Bob   | 4     |
| Bob   | 9     |
| Chris | 6     |
| David | 5     |
| David | 7     |
+-------+-------+

คำสั่งหาค่าเฉลี่ยต่อคน กรองค่าเฉลี่ย < 9.5 เรียงจากน้อยไปมาก

mysql> select Name, avg(Score) from DemoTable1338
    -> group by Name
    -> having avg(Score) < 9.5
    -> order by avg(Score);

ผลลัพธ์

+-------+------------+
| Name  | avg(Score) |
+-------+------------+
| David | 6.0000     |
| Bob   | 6.5000     |
| Chris | 7.0000     |
+-------+------------+

คำอธิบาย:

  • GROUP BY Name จัดกลุ่มตามชื่อ
  • AVG(Score) คำนวณค่าเฉลี่ยแต่ละกลุ่ม
  • HAVING AVG(Score) < 9.5 กรองกลุ่มที่ค่าเฉลี่ยน้อยกว่า 9.5
  • ORDER BY AVG(Score) เรียงตามค่าเฉลี่ย
  • ไม่สามารถใช้ WHERE AVG(Score) < 9.5 ได้ (Error: Invalid use of group function)