Coba:
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
Saat Anda menggabungkan beberapa nilai Mark
untuk menghitung rata-rata, menjadi tidak mungkin untuk mengurutkan setiap nilai Mark
. Anda harus mengurutkan berdasarkan hasil perhitungan, yaitu Average_Mark
.
Dari sudut pandang yang lebih umum, Anda diperbolehkan untuk ORDER BY
bukan SELECT
ed kolom hanya jika kolom ini adalah bagian dari tabel yang ditanyakan dan jika Anda tidak menggunakan GROUP BY
atau DISTINCT
(kecuali Anda GROUP BY
kolom yang tidak ditampilkan ini, maka Anda dapat ORDER BY
itu).
Alasannya sederhana:Jika Anda menggunakan GROUP BY
atau DISTINCT
, beberapa baris akan berpotensi ditampilkan sebagai satu. Nilai yang tidak ditampilkan di baris "gabungan" tersebut berpotensi berbeda satu sama lain, membuat ORDER BY
apa pun tidak mungkin pada nilai-nilai tersebut.
Beberapa DBMS (setidaknya MySQL) berperilaku berbeda, memungkinkan ORDER
menggunakan BY
nilai yang tidak ditampilkan, bahkan dengan GROUP BY
. Tetapi MySQL tampaknya kemudian mengurutkan berdasarkan nilai pertama yang ditemukan dari nilai yang tidak ditampilkan (lihat biola ). Jadi, lebih baik diingat bahwa ini harus dihindari, untuk mencegah hasil yang tidak terduga.
EDIT: Lihat dokumentasi
tentang MySQL GROUP BY
penanganan.