Försök:
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 aggregerar flera värden för Mark
för att beräkna medelvärdet blir det omöjligt att sortera på varje värde av Mark
. Du måste sortera på resultatet av beräkningen, dvs Average_Mark
.
Ur en mer allmän synvinkel är det tillåtet att ORDER BY
en icke SELECT
ed kolumn endast om denna kolumn är en del av de efterfrågade tabellerna och om du inte använder någon GROUP BY
eller DISTINCT
(såvida du inte GROUP BY
denna ej visade kolumn, då kan du ORDER BY
det).
Anledningen är enkel:Om du använder GROUP BY
eller DISTINCT
, kommer flera rader potentiellt att visas som en. Ej visade värden i de "sammanslagna" raderna kan eventuellt skilja sig från varandra, vilket gör vilken som helst ORDER BY
omöjligt på dessa värden.
Vissa DBMS (minst MySQL) beter sig annorlunda, vilket tillåter ORDER
ing BY
ej visade värden, även med GROUP BY
. Men MySQL verkar då sorteras efter det första påträffade värdet av icke-visat värde (se fiol ). Så det är bättre att komma ihåg att detta bör undvikas för att förhindra oförutsägbara resultat.
EDIT: Se dokumentationen
om MySQL GROUP BY
hantering.