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

MySQL: หาผลรวมค่าในคอลัมน์ตามกลุ่มค่าเดียวกัน (GROUP BY SUM)

การรวมค่า (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 ทาง:

  1. เพิ่มคอลัมน์ Id เข้า GROUP BY: GROUP BY ClientSerialNumber, Id (แต่จะแยกกลุ่มต่อ Id ได้)
  2. ใช้ ANY_VALUE(Id) หรือ MIN(Id) / MAX(Id) แทน

แนะนำ: SELECT ClientSerialNumber, SUM(ClientCost) AS TotalSum FROM ... GROUP BY ClientSerialNumber; (ไม่ต้อง SELECT Id)