Опитайте:
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
Докато събирате няколко стойности на Mark
за да се изчисли средната стойност, става невъзможно сортирането по всяка стойност на Mark
. Трябва да сортирате по резултата от изчислението, т.е. Average_Mark
.
От по-обща гледна точка имате право да ORDER BY
не SELECT
ed колона само ако тази колона е част от заявените таблици и ако не използвате GROUP BY
или DISTINCT
(освен ако не GROUP BY
тази непоказана колона, тогава можете да ORDER BY
то).
Причината е проста:ако използвате GROUP BY
или DISTINCT
, няколко реда потенциално ще бъдат показани като един. Непоказаните стойности в тези „обединени“ редове могат потенциално да се различават една от друга, правейки всеки ORDER BY
невъзможно за тези стойности.
Някои СУБД (поне MySQL) се държат по различен начин, позволявайки ORDER
ing BY
непоказани стойности, дори и с GROUP BY
. Но MySQL изглежда след това подрежда по първата срещана стойност на непоказана стойност (вижте цигулка ). Така че по-добре имайте предвид, че това трябва да се избягва, за да предотвратите непредвидими резултати.
РЕДАКТИРАНЕ: Вижте документацията
относно MySQL GROUP BY
обработка.