为什么“不是GROUP BY表达式”?

时间:2014-01-12 08:19:07

标签: sql

我在理解“不是GROUP BY表达式”错误时遇到了一些问题。 你可以看到,我有两张桌子:学生和年级学生。我需要创建一个将打印的选项:students.name,students.year,students.code和他的成绩平均(grade_students.grade)。

如果我创建SELECT只打印我的名字,avg就可以了:

SELECT 
    students.name, avg(grade_students.grade) 
FROM 
    students
INNER JOIN 
    grade_students ON students.code = grade_students.code
GROUP BY 
    students.name 
ORDER BY 
    avg_gr;

但是当我要求年份和代码时,我得到了“不是GROUP BY表达式”

SELECT 
    students.name, avg(grade_students.grade) AS avg_gr, 
    students.year, students.code 
FROM 
    students
INNER JOIN 
    grade_students ON students.code= grade_students.code
GROUP BY 
    students.name 
ORDER BY 
    avg_gr;

请给我一个提示,找出这里有什么问题。

PS。我不是在stackoverflow.com上做我的作业,但我承认,我正在为考试做准备:)

编辑:

Name    Null     Type      -- students    
------- -------- ------------ 
CODE NOT NULL NUMBER(4)    
NAME VARCHAR2(20) 
SECOND_NAME VARCHAR2(20) 
YEAR NUMBER(1)  

Name Null Type          -- grade_students
---- ---- ----------- 
CODE NUMBER(4) REFERENCES students ( code),   
NOTA      NUMBER(5,2)

3 个答案:

答案 0 :(得分:3)

您需要将students.yearstudents.code添加到group by子句中:

SELECT students.name, avg(grade_students.grade) AS avg_gr, students.year, students.code FROM students
 INNER JOIN grade_students ON students.code= grade_studenti.code
 GROUP BY students.name, students.year, students.code
 ORDER BY avg_gr;

或者您需要汇总这些字段:

SELECT students.name, avg(grade_students.grade) AS avg_gr, MAX(students.year) AS max_std_year, MAX(students.code) AS max_std_code FROM students
 INNER JOIN grade_students ON students.code= grade_studenti.code
 GROUP BY students.name ORDER BY avg_gr;

答案 1 :(得分:0)

SELECT s.name, avg(g.grade) AS avg_gr, s.year, s.code FROM students s INNER JOIN grade_students g ON s.code= g.code GROUP BY s.name, s.year, s.code ORDER BY avg_gr; 

此处讨论此问题:Oracle: NOT A GROUP BY EXPRESSION ERROR

答案 2 :(得分:0)

如果两名学生姓名相同但年份不同,该怎么办?你说你想按学生姓名分组,所以你只想要返回一条记录,但是你也想要两年,当你的结果行只有一年的空间时。

在我看来,在这里使用顶级GROUP BY是没有意义的。你想要平均学生成绩(每个学生代码)?然后将 分组。

SELECT students.name, avg_grade_students.avg_grade
FROM students
INNER JOIN (
    SELECT code, AVG(grade) AS avg_grade
    FROM grade_students
    GROUP BY code
) AS avg_grade_students
ON students.code = avg_grade_students.code
ORDER BY avg_grade_students.avg_grade;

在这里,您可以毫无问题地添加students所需的任何列。

(精确语法略微取决于所使用的数据库。)