Prova:
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
Mentre aggreghi diversi valori di Mark
per calcolare la media, diventa impossibile ordinare su ogni valore di Mark
. Devi ordinare in base al risultato del calcolo, ovvero Average_Mark
.
Da un punto di vista più generale, sei autorizzato a ORDER BY
un non SELECT
ed solo se questa colonna fa parte delle tabelle interrogate e se non utilizzi alcun GROUP BY
o DISTINCT
(a meno che tu non GROUP BY
questa colonna non visualizzata, quindi puoi ORDER BY
esso).
Il motivo è semplice:se usi GROUP BY
o DISTINCT
, diverse righe verranno potenzialmente visualizzate come una sola. I valori non visualizzati in quelle righe "unite" possono essere potenzialmente diversi l'uno dall'altro, rendendo qualsiasi ORDER BY
impossibile su quei valori.
Alcuni DBMS (almeno MySQL) si comportano in modo diverso, consentendo ORDER
in BY
valori non visualizzati, anche con GROUP BY
. Ma MySQL sembra quindi ordinare in base al primo valore rilevato del valore non visualizzato (vedi fiddle ). Quindi, meglio tenere presente che questo dovrebbe essere evitato, per evitare risultati imprevedibili.
MODIFICA: Consulta la documentazione
su MySQL GROUP BY
gestione.