Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle :PAS UNE ERREUR DE GROUPE PAR EXPRESSION

Essayez :

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

Lorsque vous agrégez plusieurs valeurs de Mark pour calculer la moyenne, il devient impossible de trier sur chaque valeur de Mark . Vous devez trier sur le résultat du calcul, c'est-à-dire Average_Mark .

D'un point de vue plus général, vous êtes autorisé à ORDER BY un non SELECT ed colonne uniquement si cette colonne fait partie des tables interrogées et si vous n'utilisez pas de GROUP BY ou DISTINCT (sauf si vous GROUP BY cette colonne non affichée, alors vous pouvez ORDER BY il).

La raison est simple :si vous utilisez GROUP BY ou DISTINCT , plusieurs lignes seront potentiellement affichées comme une seule. Les valeurs non affichées dans ces lignes "fusionnées" peuvent potentiellement être différentes les unes des autres, ce qui rend tout ORDER BY impossible sur ces valeurs.

Certains SGBD (MySQL au moins) se comportent différemment, permettant ORDER ing BY valeurs non affichées, même avec GROUP BY . Mais MySQL semble alors ordonner par la première valeur rencontrée de valeur non affichée (voir fiddle ). Donc, mieux vaut garder à l'esprit que cela doit être évité, pour éviter des résultats imprévisibles.

MODIF : Voir la documentation à propos de MySQL GROUP BY manipulation.