Oracle:不是表达错误的分组

时间:2013-07-19 12:54:42

标签: sql oracle

以下是我的查询。我不确定是什么原因造成Not A group by expression错误。任何帮助深表感谢。 =)

SELECT c.courseID, c.courseName, AVG(a.Mark) as Average_Mark
FROM course c, assessment a
WHERE c.courseID = a.courseID
Group by c.courseID, c.courseName
ORDER BY Mark DESC;

2 个答案:

答案 0 :(得分:11)

尝试:

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

在汇总多个Mark值以计算平均值时,无法对Mark的每个值进行排序。您必须对计算结果进行排序,即Average_Mark


从更一般的角度来看,只有当此列是查询表的一部分并且您不使用任何{{1}时,才允许ORDER BYSELECT ed列}}或GROUP BY(除非你DISTINCT这个未显示的列,否则你可以GROUP BY它。

原因很简单:如果您使用ORDER BYGROUP BY,则可能会有多行显示为一行。这些“合并”行中的非显示值可能彼此不同,使得这些值上的任何DISTINCT都不可能。

某些DBMS(至少MySQL)表现不同,允许ORDER BY ORDER非显示值,即使BY也是如此。但是MySQL似乎按照第一个遇到的非显示值的值来排序(参见fiddle)。所以,最好记住这应该避免,以防止不可预测的结果。

编辑:请参阅有关MySQL GROUP BY处理的documentation

答案 1 :(得分:2)

尝试

ORDER BY Average_Mark

而不是

ORDER BY Mark