GROUP BY + SUM() + ORDER BY: สรุปและเรียงลำดับ
รวมแถวที่มี StudentName เดียวกัน คำนวณ SUM(StudentMarks) แล้วเรียงจากคะแนนรวมมากไปน้อย
สร้างตารางและข้อมูล
mysql> CREATE TABLE DemoTable1499 (
-> StudentName VARCHAR(20),
-> StudentMarks INT
-> );
Query OK, 0 rows affected (0.46 sec)
mysql> INSERT INTO DemoTable1499 VALUES
-> ('Chris', 56), ('David', 78), ('Bob', 98),
-> ('Chris', 45), ('David', 98), ('Bob', 58);
Query OK, 6 rows affected
ข้อมูลก่อนจัดกลุ่ม
+-------------+--------------+ | StudentName | StudentMarks | +-------------+--------------+ | Chris | 56 | | David | 78 | | Bob | 98 | | Chris | 45 | | David | 98 | | Bob | 58 | +-------------+--------------+
คำสั่ง: SUM แล้ว ORDER BY ผลรวม DESC
mysql> SELECT StudentName, SUM(StudentMarks) AS TotalSum
-> FROM DemoTable1499
-> GROUP BY StudentName
-> ORDER BY TotalSum DESC;
ผลลัพธ์
+-------------+----------+ | StudentName | TotalSum | +-------------+----------+ | David | 176 | | Bob | 156 | | Chris | 101 | +-------------+----------+
คำอธิบาย
GROUP BY StudentName- จัดกลุ่มแถวที่ชื่อเดียวกันSUM(StudentMarks)- คำนวณผลรวมในแต่ละกลุ่มAS TotalSum- ตั้ง Alias ให้คอลัมน์ผลรวมORDER BY TotalSum DESC- เรียงตาม Alias (MySQL อนุญาต) จากมากไปน้อย
ขยาย: เพิ่มเงื่อนไข HAVING (กรองหลัง GROUP BY)
SELECT StudentName, SUM(StudentMarks) AS TotalSum FROM DemoTable1499 GROUP BY StudentName HAVING TotalSum > 120 ORDER BY TotalSum DESC;
ผลลัพธ์ (เฉพาะ David และ Bob)
+-------------+----------+ | StudentName | TotalSum | +-------------+----------+ | David | 176 | | Bob | 156 | +-------------+----------+
สรุปลำดับการประมวลผล SQL
FROM/JOINWHERE(Filter แถวเดี่ยว)GROUP BYHAVING(Filter กลุ่ม)SELECT(คำนวณ Aggregate, Alias)ORDER BY(เรียง - ใช้ Alias ได้)LIMIT