การรวมค่า (SUM) แยกตามกลุ่มค่าที่เหมือนกันด้วย GROUP BY
ใช้ GROUP BY จัดกลุ่มแถวที่มีค่าเหมือนกันในคอลัมน์ที่ระบุ แล้วใช้ SUM() คำนวณผลรวมของคอลัมน์ตัวเลขในแต่ละกลุ่ม
ตัวอย่างการใช้งาน
สร้างตารางค่าใช้จ่ายลูกค้า:
mysql> CREATE TABLE sumOfFieldsDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ClientSerialNumber VARCHAR(100),
-> ClientCost INT
-> );
Query OK, 0 rows affected (0.50 sec)
mysql> INSERT INTO sumOfFieldsDemo(ClientSerialNumber, ClientCost) VALUES('1111', 450);
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO sumOfFieldsDemo(ClientSerialNumber, ClientCost) VALUES('2222', 550);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO sumOfFieldsDemo(ClientSerialNumber, ClientCost) VALUES('3333', 150);
Query OK, 1 row affected (0.64 sec)
mysql> INSERT INTO sumOfFieldsDemo(ClientSerialNumber, ClientCost) VALUES('3333', 250);
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO sumOfFieldsDemo(ClientSerialNumber, ClientCost) VALUES('2222', 1000);
Query OK, 1 row affected (0.10 sec)
mysql> INSERT INTO sumOfFieldsDemo(ClientSerialNumber, ClientCost) VALUES('1111', 1000);
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO sumOfFieldsDemo(ClientSerialNumber, ClientCost) VALUES('1111', 500);
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO sumOfFieldsDemo(ClientSerialNumber, ClientCost) VALUES('4444', 100);
Query OK, 1 row affected (0.17 sec)
ข้อมูลทั้งหมด:
mysql> SELECT * FROM sumOfFieldsDemo;
+----+--------------------+------------+
| Id | ClientSerialNumber | ClientCost |
+----+--------------------+------------+
| 1 | 1111 | 450 |
| 2 | 2222 | 550 |
| 3 | 3333 | 150 |
| 4 | 3333 | 250 |
| 5 | 2222 | 1000 |
| 6 | 1111 | 1000 |
| 7 | 1111 | 500 |
| 8 | 4444 | 100 |
+----+--------------------+------------+
8 rows in set (0.00 sec)
หาผลรวม ClientCost แยกตาม ClientSerialNumber:
mysql> SELECT Id, ClientSerialNumber, SUM(ClientCost) AS TotalSum
-> FROM sumOfFieldsDemo
-> GROUP BY ClientSerialNumber;
ผลลัพธ์:
+----+--------------------+----------+
| Id | ClientSerialNumber | TotalSum |
+----+--------------------+----------+
| 1 | 1111 | 1950 |
| 2 | 2222 | 1550 |
| 3 | 3333 | 400 |
| 8 | 4444 | 100 |
+----+--------------------+----------+
4 rows in set (0.00 sec)
คำอธิบาย
GROUP BY ClientSerialNumberรวมแถวที่มีหมายเลขซีเรียลเหมือนกันSUM(ClientCost)บวกค่าใช้จ่ายในแต่ละกลุ่ม- คอลัมน์
Idที่แสดงเป็นตัวแรกของแต่ละกลุ่ม (MySQL โหมด DEFAULT อนุญาต แต่ควรระบุชัดเจนหรือใช้ ANY_VALUE)
ข้อควรระวัง (ONLY_FULL_GROUP_BY)
ใน MySQL 5.7+ โหมด ONLY_FULL_GROUP_BY (Default ON) ต้องการให้คอลัมน์ใน SELECT ต้องอยู่ใน GROUP BY หรืออยู่ในฟังก์ชันรวม แก้ได้ 2 ทาง:
- เพิ่มคอลัมน์ Id เข้า GROUP BY:
GROUP BY ClientSerialNumber, Id(แต่จะแยกกลุ่มต่อ Id ได้) - ใช้
ANY_VALUE(Id)หรือMIN(Id)/MAX(Id)แทน
แนะนำ: SELECT ClientSerialNumber, SUM(ClientCost) AS TotalSum FROM ... GROUP BY ClientSerialNumber; (ไม่ต้อง SELECT Id)