Hãy thử:
SELECT c.courseid,
c.coursename,
AVG(a.mark) AS Average_Mark
FROM COURSE c
INNER JOIN ASSESSMENT a
ON c.courseid = a.courseid
GROUP BY c.courseid,
c.coursename
ORDER BY 3 DESC; -- or ORDER BY Average_Mark DESC
Khi bạn tổng hợp một số giá trị của Mark
để tính giá trị trung bình, không thể sắp xếp theo từng giá trị của Mark
. Bạn phải sắp xếp dựa trên kết quả tính toán, tức là Average_Mark
.
Từ quan điểm tổng quát hơn, bạn được phép ORDER BY
không phải SELECT
cột ed chỉ khi cột này là một phần của các bảng được truy vấn và nếu bạn không sử dụng bất kỳ GROUP BY
nào hoặc DISTINCT
(trừ khi bạn GROUP BY
cột này không được hiển thị, thì bạn có thể ORDER BY
nó).
Lý do rất đơn giản:Nếu bạn sử dụng GROUP BY
hoặc DISTINCT
, một số hàng sẽ có khả năng được hiển thị thành một. Các giá trị không được hiển thị trong các hàng "đã hợp nhất" đó có thể khác nhau, làm cho bất kỳ ORDER BY
nào không thể với những giá trị đó.
Một số DBMS (ít nhất là MySQL) hoạt động khác nhau, cho phép ORDER
ing BY
các giá trị không được hiển thị, ngay cả với GROUP BY
. Nhưng sau đó MySQL dường như sắp xếp thứ tự theo giá trị gặp phải đầu tiên của giá trị không được hiển thị (xem fiddle ). Vì vậy, tốt hơn hết hãy nhớ rằng điều này nên tránh, để tránh những kết quả không thể tin được.
CHỈNH SỬA: Xem tài liệu
về MySQL GROUP BY
xử lý.