SQLPLUS - 计算每个学生的 GPA,给定他们每门课程的成绩、总学分和每门课程的学分

SQLPLUS - Calculating GPA for each student in, given their grade on each course, total credit hours, and credit hours for each course

我有这些表格(删除了一些与我的问题无关的信息)

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

sum(点 * course.credits) / 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,因为我还不熟悉它。另外,因为这是一个家庭作业问题,所以我更喜欢提示而不是实际的解决方案。谢谢!

您正在使用 聚合 SQL 查询,其中结果按学生分组。您需要向 Oracle 表明这一点,方法是在查询中添加 GROUP BY 子句:

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 而不是隐式语法(即 table 名称在 FROM 子句和连接条件中用逗号分隔在 WHERE 子句中)。我这样修改了你的查询。

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