SQL 组错误 ORA-00979

Posted

技术标签:

【中文标题】SQL 组错误 ORA-00979【英文标题】:SQL Group By error ORA-00979 【发布时间】:2014-12-24 01:02:51 【问题描述】:

我正在尝试给出这个查询:

select s_name, course from Student group by course;

但我得到一个错误(ORA-00979 Not a GROUP BY EXPRESSION)。

我想列出同一课程中所有学生的姓名。 还有另一种方法吗?如果没有,实现此查询的正确方法是什么?如果有人能给我所需的确切代码,我将不胜感激。

【问题讨论】:

s_name 应该在 GROUP BY 中或从选择列表中删除 我真的不太懂SQL,请问你能输入准确的代码吗? 我想列出来自同一课程(包含在“课程”中)的所有学生的姓名(包含在“s_name”中)。我相信“分组”命令可以完成这项工作,但我不确定。 确切的代码取决于你想要什么 那么你确实想要排序(ORDER BY),而不是分组。 【参考方案1】:

一种变体(Oracle 11g):

select course, listagg(s_name, ', ') within group (order by s_name) 
 from student
group by course; 

Oracle 10g(未记录的秘密函数wm_concat

select course, wm_concat(s_name)
 from student
group by course; 

【讨论】:

感谢您的回答,虽然我不知道我必须使用 ORDER BY 而不是 GROUP BY 才能达到预期的效果。 @Don't be Evil Irony 没关系,我不知道 wm_concat 存在,所以它对我很有用。 天哪,这带来了甚至更好的结果,但是我的老师甚至不了解秘密的 wm_concat 函数。感谢您的帮助。【参考方案2】:

对于你想要的,你不应该使用GROUP BY。 GROUP BY 的目的是汇总每个组的信息。

由于您希望了解每门课程的详细信息,因此您应该使用ORDER BY 来确保您的输出与同一课程中的学生一起列出。

select  s_name, course
from    Student
order by course

有关GROUP BY 用途的示例,请尝试以下操作:

select  course, COUNT(*) as NumStudents
from    Student
group by course

【讨论】:

谢谢。感谢您提供的简化示例,我终于知道了使用 GROUP BY 表达式的位置以及如何使用。

以上是关于SQL 组错误 ORA-00979的主要内容,如果未能解决你的问题,请参考以下文章

关于ORA-00979 不是 GROUP BY 表达式错误的解释

SQLSyntaxErrorException: ORA-00979: 不是 GROUP BY 表达式

错误 - ORA-00979: 不是 GROUP BY 表达式,但在我删除 f.film_no AS "Film Number" 时有效

ORA-00979: 在使用子查询查询视图时不是 GROUP BY 表达式

ORA-00979: 不是 GROUP BY 表达式

ORA-00979: 不是 GROUP BY 表达式