Vấn đề:
Bạn muốn sắp xếp các hàng theo tổng số được tạo bởi một nhóm bản ghi.
Ví dụ:
Cơ sở dữ liệu của chúng tôi có một bảng có tên training
với dữ liệu trong bốn cột: id , đăng nhập , năm và điểm số .
id | đăng nhập | năm | điểm |
---|---|---|---|
1 | Andy | 2018 | 24 |
2 | Lucy | 2019 | 25 |
3 | Andy | 2019 | 20 |
4 | Lucy | 2018 | 16 |
5 | Gary | 2019 | 18 |
6 | Gary | 2018 | 19 |
7 | Gary | 2017 | 22 |
8 | Lucy | 2017 | 21 |
9 | Andy | 2017 | 26 |
Hãy lấy tên đăng nhập của từng người chơi cùng với tổng điểm của tất cả các năm, xếp các kỷ lục theo thứ tự giảm dần theo tổng điểm của người chơi.
Giải pháp:
Chúng tôi sẽ sử dụng toán tử ORDER BY để sắp xếp các bản ghi dựa trên hàm tổng hợp SUM()
, tính toán tổng điểm cho mỗi người chơi trong tất cả các năm.
Đây là truy vấn bạn sẽ viết:
SELECT login, SUM(score) AS total_score FROM training GROUP BY login ORDER BY SUM(score) DESC;
Đây là kết quả:
đăng nhập | total_score |
---|---|
Andy | 70 |
Lucy | 62 |
Gary | 59 |
Thảo luận:
Sử dụng ORDER BY nếu bạn muốn sắp xếp các hàng theo giá trị được trả về bởi một hàm tổng hợp như SUM()
. Toán tử ORDER BY được theo sau bởi hàm tổng hợp (trong ví dụ của chúng tôi, SUM()
). DESC được đặt sau hàm này để chỉ định thứ tự sắp xếp giảm dần. Do đó, các giá trị tổng hợp cao nhất được hiển thị đầu tiên, sau đó các giá trị thấp hơn dần dần được hiển thị. Để sắp xếp theo thứ tự tăng dần, bạn có thể chỉ định ASC hoặc đơn giản là bỏ qua một trong hai từ khóa, vì tăng dần là thứ tự sắp xếp mặc định.
Trong truy vấn ở trên, chúng tôi chọn thông tin đăng nhập của từng người chơi và tổng điểm của họ trong tất cả các năm. Tổng điểm này được tính bằng cách sử dụng SUM () với cột điểm làm đối số. Chúng tôi thêm một bí danh cho giá trị tổng hợp này (SUM(score) AS total_score
); bạn có thể sử dụng bí danh này thay vì hàm tổng hợp trong mệnh đề ORDER BY (ORDER BY total_score DESC
).
Lưu ý rằng chúng tôi bao gồm đăng nhập trong GROUP BY. Nếu chúng tôi bao gồm một cột trong SELECT, chúng tôi cũng phải sử dụng cột trong GROUP BY. Trong ví dụ này, chúng tôi sử dụng mệnh đề GROUP BY theo sau là đăng nhập cột vì chúng tôi đặt cột này trong SELECT. Lưu ý rằng GROUP BY được đặt trước ORDER BY trong truy vấn.