我在理解“不是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)
答案 0 :(得分:3)
您需要将students.year
和students.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;
答案 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
所需的任何列。
(精确语法略微取决于所使用的数据库。)