Zkuste:
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
Když agregujete několik hodnot Mark
aby bylo možné vypočítat průměr, je nemožné třídit podle každé hodnoty Mark
. Musíte seřadit podle výsledku výpočtu, tj. Average_Mark
.
Z obecnějšího hlediska máte povoleno ORDER BY
jiný než SELECT
ed sloupec pouze v případě, že je tento sloupec součástí dotazovaných tabulek a pokud nepoužíváte žádné GROUP BY
nebo DISTINCT
(pokud jste GROUP BY
tento nezobrazený sloupec, pak můžete ORDER BY
to).
Důvod je jednoduchý:Pokud používáte GROUP BY
nebo DISTINCT
, několik řádků se potenciálně zobrazí jako jeden. Nezobrazené hodnoty v těchto "sloučených" řádcích se mohou potenciálně navzájem lišit, takže ORDER BY
na těchto hodnotách nemožné.
Některé DBMS (alespoň MySQL) se chovají odlišně a umožňují ORDER
pomocí BY
nezobrazené hodnoty, dokonce ani s GROUP BY
. Zdá se však, že MySQL se pak řadí podle první zjištěné hodnoty nezobrazené hodnoty (viz fiddle ). Takže mějte na paměti, že tomu je třeba se vyhnout, abyste předešli nepředvídatelným výsledkům.
UPRAVIT: Viz dokumentaci
o MySQL GROUP BY
manipulace.