Essayez :
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
Lorsque vous agrégez plusieurs valeurs de Mark
pour calculer la moyenne, il devient impossible de trier sur chaque valeur de Mark
. Vous devez trier sur le résultat du calcul, c'est-à-dire Average_Mark
.
D'un point de vue plus général, vous êtes autorisé à ORDER BY
un non SELECT
ed colonne uniquement si cette colonne fait partie des tables interrogées et si vous n'utilisez pas de GROUP BY
ou DISTINCT
(sauf si vous GROUP BY
cette colonne non affichée, alors vous pouvez ORDER BY
il).
La raison est simple :si vous utilisez GROUP BY
ou DISTINCT
, plusieurs lignes seront potentiellement affichées comme une seule. Les valeurs non affichées dans ces lignes "fusionnées" peuvent potentiellement être différentes les unes des autres, ce qui rend tout ORDER BY
impossible sur ces valeurs.
Certains SGBD (MySQL au moins) se comportent différemment, permettant ORDER
ing BY
valeurs non affichées, même avec GROUP BY
. Mais MySQL semble alors ordonner par la première valeur rencontrée de valeur non affichée (voir fiddle ). Donc, mieux vaut garder à l'esprit que cela doit être évité, pour éviter des résultats imprévisibles.
MODIF : Voir la documentation
à propos de MySQL GROUP BY
manipulation.