如何使用sql正确回答这个问题

e5nszbig  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(303)

“第二份报告提供了一份完整的学生名单,列出了每个学生所学的科目、该科目的成绩以及所学单元的平均分数。
所需列如下:

student ID,
forename,
surname,
subject ID,
result

在每个学生展示后,报告还应显示每个学生为其课程获得的平均分数。
报告末尾应显示总体平均分。”
我对sql非常陌生,所以对于这个问题的语法方面的任何帮助都将不胜感激。
目前,我已经使用以下工具显示了所有列以及所有学生详细信息:

select student.student_ID
     , student.forename
     , student.surname
     , result.subject_ID
     , result.result 
  from student
     , result;

但不管什么原因,它给我的结果都是一样的

正如我所说的,我对sql不是很在行,所以即使只是一个伪syntaz也会很好地解释我必须做些什么来完成这个任务。
我想对于有基本sql知识的人来说应该很简单。
提前谢谢
康纳
更新:进度图片
但是,在添加分组依据时。我好像只上了一堂课?我需要用别的东西来分组吗?一类图片
谢谢你们,我已经在不和谐服务器上找了几个小时的帮助,这是迪福帮了我很多。干杯
更新2:
我现在得到这个加上汇总,它看起来不错,但我不认为这些平均值对应于每个学生
很抱歉这么糟糕。。。我很笨,第四排是每个学生的平均数,这是正确的,但是它应该这样显示吗?

nzkunb0c

nzkunb0c1#

您尚未指定行之间的任何关系 student 以及 result 在您的查询中。所以它只返回表中每一行的组合——这称为交叉积或交叉联接。
您需要指出行应该如何配对,以便每个学生只显示他们自己的结果,而不是其他学生的结果。你用一个 JOINON 条件。

SELECT student.student_ID, student.forename, student.surname, result.subject_ID, result.result 
FROM student
JOIN result ON student.student_ID = result.student_ID

为了得到每个学生的平均数,你需要使用 GROUP BY student.student_ID 以及聚合函数 AVG() .

SELECT student.student_ID, student.forename, student.surname, AVG(result.result) AS avg_result
FROM student
JOIN result ON student.student_ID = result.student_ID
GROUP BY student.student_ID

为了得到一个总体平均数,你不需要分组。在这种情况下,你甚至不需要加入 student table。

SELECT AVG(result) AS avg_result
FROM result

通过使用 WITH ROLLUP 选项。

SELECT student.student_ID, student.forename, student.surname, AVG(result.result) AS avg_result
FROM student
JOIN result ON student.student_ID = result.student_ID
GROUP BY student.student_ID, result.subject_ID WITH ROLLUP

每个学生的平均 subject_ID = NULL ,总体平均值 student_ID = NULL .

k2arahey

k2arahey2#

在查询中,不指定链接两个表的值。
结果表是否有包含学生id的键列?
那么查询至少应该声明它们应该相等
按原样使用查询并添加where子句。

select 
  student.student_ID, 
  student.forename, 
  student.surname, 
  result.subject_ID, 
  result.result 
from student, result 
where student.student_ID = result.student_ID

相关问题