Prøv:
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
Når du samler flere værdier af Mark
for at beregne gennemsnittet bliver det umuligt at sortere på hver værdi af Mark
. Du skal sortere på resultatet af beregningen, dvs. Average_Mark
.
Fra et mere generelt synspunkt har du lov til at ORDER BY
en ikke SELECT
ed kolonne kun, hvis denne kolonne er en del af de forespurgte tabeller, og hvis du ikke bruger nogen GROUP BY
eller DISTINCT
(medmindre du GROUP BY
denne ikke-viste kolonne, så kan du ORDER BY
det).
Årsagen er enkel:Hvis du bruger GROUP BY
eller DISTINCT
, vil flere rækker potentielt blive vist som én. Ikke-viste værdier i disse "sammenflettede" rækker kan potentielt være forskellige fra hinanden, hvilket gør enhver ORDER BY
umuligt på disse værdier.
Nogle DBMS (minst MySQL) opfører sig anderledes, hvilket tillader ORDER
ing BY
ikke viste værdier, selv med GROUP BY
. Men MySQL ser ud til at sortere efter den først stødte værdi af ikke-vist værdi (se spillespil ). Så det er bedst at huske på, at dette bør undgås for at forhindre uforudsigelige resultater.
EDIT: Se dokumentationen
om MySQL GROUP BY
håndtering.