Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle:NON UN GRUPPO PER ERRORE DI ESPRESSIONE

Prova:

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

Mentre aggreghi diversi valori di Mark per calcolare la media, diventa impossibile ordinare su ogni valore di Mark . Devi ordinare in base al risultato del calcolo, ovvero Average_Mark .

Da un punto di vista più generale, sei autorizzato a ORDER BY un non SELECT ed solo se questa colonna fa parte delle tabelle interrogate e se non utilizzi alcun GROUP BY o DISTINCT (a meno che tu non GROUP BY questa colonna non visualizzata, quindi puoi ORDER BY esso).

Il motivo è semplice:se usi GROUP BY o DISTINCT , diverse righe verranno potenzialmente visualizzate come una sola. I valori non visualizzati in quelle righe "unite" possono essere potenzialmente diversi l'uno dall'altro, rendendo qualsiasi ORDER BY impossibile su quei valori.

Alcuni DBMS (almeno MySQL) si comportano in modo diverso, consentendo ORDER in BY valori non visualizzati, anche con GROUP BY . Ma MySQL sembra quindi ordinare in base al primo valore rilevato del valore non visualizzato (vedi fiddle ). Quindi, meglio tenere presente che questo dovrebbe essere evitato, per evitare risultati imprevedibili.

MODIFICA: Consulta la documentazione su MySQL GROUP BY gestione.