Vấn đề: Tính tổng điểm cho mỗi học sinh từ bảng ghi nhận nhiều lần thi
Bảng lưu nhiều hàng cho cùng một học sinh (mỗi hàng là một lần thi). Cần gom nhóm theo tên và tính tổng điểm.
Giải pháp: GROUP BY + SUM()
Cú pháp chuẩn: SELECT column, SUM(numeric_column) FROM table GROUP BY column;
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (
StudentName VARCHAR(20),
StudentMarks INT
);
INSERT INTO DemoTable VALUES
('Chris', 67), ('David', 97), ('Chris', 57), ('David', 45), ('Chris', 89);
2. Dữ liệu gốc
+-------------+--------------+
| StudentName | StudentMarks |
+-------------+--------------+
| Chris | 67 |
| David | 97 |
| Chris | 57 |
| David | 45 |
| Chris | 89 |
+-------------+--------------+
3. Truy vấn gom nhóm và tính tổng
SELECT StudentName, SUM(StudentMarks) AS TotalMarks
FROM DemoTable
GROUP BY StudentName;
4. Kết quả
+-------------+------------+
| StudentName | TotalMarks |
+-------------+------------+
| Chris | 213 |
| David | 142 |
+-------------+------------+
Giải thích
GROUP BY StudentName– Gom các hàng có cùng tên thành một nhóm.SUM(StudentMarks)– Tính tổng cột điểm trong mỗi nhóm.AS TotalMarks– Đặt alias cho cột kết quả.
Mở rộng: Nhóm theo nhiều cột
SELECT StudentName, Subject, SUM(Marks)
FROM Scores
GROUP BY StudentName, Subject;
Lưu ý
- Các cột trong
SELECTphải nằm trongGROUP BYhoặc là hàm tổng hợp (SUM, COUNT, AVG, MAX, MIN...). - MySQL 5.7+ mặc định bật
ONLY_FULL_GROUP_BY– bắt buộc tuân thủ quy tắc này. - Để tính trung bình:
AVG(StudentMarks).