sql >> Base de Datos >  >> RDS >> Oracle

Oracle:NO ES UN GRUPO POR ERROR DE EXPRESIÓN

Prueba:

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

A medida que agrega varios valores de Mark para calcular el promedio, se vuelve imposible ordenar cada valor de Mark . Tienes que ordenar el resultado del cálculo, es decir, Average_Mark .

Desde un punto de vista más general, se le permite ORDER BY un no SELECT ed columna solo si esta columna es parte de las tablas consultadas y si no usa ningún GROUP BY o DISTINCT (a menos que GROUP BY esta columna no mostrada, entonces puede ORDER BY eso).

La razón es simple:si usa GROUP BY o DISTINCT , varias filas se mostrarán potencialmente como una sola. Los valores no mostrados en esas filas "combinadas" pueden ser potencialmente diferentes entre sí, lo que hace que cualquier ORDER BY imposible en esos valores.

Algunos DBMS (al menos MySQL) se comportan de manera diferente, lo que permite ORDER ing BY valores no mostrados, incluso con GROUP BY . Pero MySQL parece ordenar por el primer valor encontrado del valor no mostrado (ver fiddle ). Por lo tanto, mejor tenga en cuenta que esto debe evitarse para evitar resultados impredecibles.

EDITAR: Consulte la documentación sobre MySQL GROUP BY manipulación.