Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle:NÃO É UM GRUPO POR EXPRESSÃO ERRO


Tentar:
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

Conforme você agrega vários valores de Mark para calcular a média, torna-se impossível classificar cada valor de Mark . Você precisa classificar o resultado do cálculo, ou seja, Average_Mark .

De um ponto de vista mais geral, você tem permissão para ORDER BY um não SELECT ed somente se esta coluna fizer parte das tabelas consultadas e se você não usar nenhum GROUP BY ou DISTINCT (a menos que você GROUP BY esta coluna não exibida, então você pode ORDER BY isto).

A razão é simples:se você usar GROUP BY ou DISTINCT , várias linhas serão potencialmente exibidas como uma. Os valores não exibidos nessas linhas "mescladas" podem ser potencialmente diferentes uns dos outros, tornando qualquer ORDER BY impossível nesses valores.

Alguns SGBDs (pelo menos MySQL) se comportam de forma diferente, permitindo ORDER ing BY valores não exibidos, mesmo com GROUP BY . Mas o MySQL parece então ordenar pelo primeiro valor encontrado do valor não exibido (veja fiddle ). Portanto, é melhor ter em mente que isso deve ser evitado, para evitar resultados imprevisíveis.

EDITAR: Consulte a documentação sobre MySQL GROUP BY manipulação.