Probeer:
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
Terwijl u verschillende waarden van Mark
samenvoegt, om het gemiddelde te berekenen, wordt het onmogelijk om te sorteren op elke waarde van Mark
. U moet sorteren op het resultaat van de berekening, d.w.z. Average_Mark
.
Vanuit een meer algemeen oogpunt mag u ORDER BY
een niet SELECT
ed-kolom alleen als deze kolom deel uitmaakt van de opgevraagde tabellen en als u geen GROUP BY
gebruikt of DISTINCT
(tenzij je GROUP BY
deze niet weergegeven kolom, dan kunt u ORDER BY
het).
De reden is simpel:als u GROUP BY
. gebruikt of DISTINCT
, worden mogelijk meerdere rijen als één weergegeven. Niet weergegeven waarden in die "samengevoegde" rijen kunnen mogelijk van elkaar verschillen, waardoor elke ORDER BY
onmogelijk op die waarden.
Sommige DBMS (minstens MySQL) gedragen zich anders, waardoor ORDER
ing BY
niet weergegeven waarden, zelfs met GROUP BY
. Maar MySQL lijkt dan te sorteren op de eerst aangetroffen waarde van niet-weergegeven waarde (zie fiddle ). Houd er dus rekening mee dat dit moet worden vermeden om onvoorspelbare resultaten te voorkomen.
BEWERKEN: Zie de documentatie
over MySQL GROUP BY
behandeling.