SQLPLUS-根据每门课程的成绩,每门课程的总学分和学分计算每个学生的GPA

时间:2019-02-27 01:06:26

标签: sql oracle sqlplus

我有这些表格(一些信息与我的问题无关,因此已删除)

  • 课程(course_id,学分)
  • 学生(student_id,total_credits)
  • 参加(课程ID,学生ID,年级)
  • grade_point(等级,分数)

,我需要为每个学生找到gpa。是加权的gpa,这意味着公式将是

总和(积分*课程。学分)/ total_credits

目前,我正在努力告诉SQL如何为每个学生计算这个。我写的查询是这样的:

SELECT student.student_id, (sum(grade_point.points * course.credits) / 
       student.total_credits) AS GPA
FROM   student, course, takes, grade_point
WHERE  grade_point.grade = takes.grade
AND    takes.course_id = course.course_id
AND    student.student_id = takes.student_id;

但是,正如预期的那样,我收到有关需要GROUP BY的错误。我知道如果使用聚合函数,则需要使用GROUP BY,但是我不确定将其分组的依据。

我读到您必须将不在聚合函数中的SELECT表达式添加到GROUP BY,但是如果这样做,我会得到一个ORA-00979: not a GROUP BY expression

我想避免使用PL / SQL,因为我对此还不熟悉。另外,因为这是一个家庭作业问题,所以我建议使用提示而不是实际的解决方案。谢谢!

1 个答案:

答案 0 :(得分:0)

您使用的是汇总 SQL查询,其中结果按学生分组。您需要通过向查询添加GROUP BY子句来向Oracle指出这一点:

SELECT 
    s.student_id, 
    (SUM(gp.points * c.credits) / s.total_credits) AS GPA
FROM 
    student
    INNER JOIN takes t ON s.student_id = t.student_id
    INNER JOIN course c ON t.course_id = c.course_id
    INNER JOIN grade_point gp ON gp.grade = t.grade
GROUP BY s.student_id, s.total_credits

另一个好的SQL惯例是使用显式JOIN而不是隐式语法(即,表名在FROM子句中用逗号分隔,在WHERE子句中用联接条件分隔)。我以这种方式修改了您的查询。

使用表别名也是一个好主意:它使查询更具可读性,并且通常避免名称冲突。