sql >> Databáze >  >> RDS >> Oracle

Oracle:NEJDE O CHYBU PODLE VÝRAZU

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.



  1. Jak mohu použít GROUP_CONCAT v Rails?

  2. PHP MySQL Vyberte ID z jedné tabulky a informace z jiné tabulky

  3. mysql:stačí vybrat, co se stane o víkendu

  4. Objednávka CakePHP nefunguje