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

Posted

技术标签:

【中文标题】SQLPLUS - 根据每门课程的成绩、总学分和每门课程的学分计算每个学生的 GPA【英文标题】:SQLPLUS - Calculating GPA for each student in, given their grade on each course, total credit hours, and credit hours for each course 【发布时间】:2019-02-27 01:06:25 【问题描述】:

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

课程(course_id,学分) 学生(student_id, total_credits) 参加(course_id、student_id、成绩) grade_point(等级,分数)

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

sum(points * 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,因为我还不熟悉它。此外,因为这是一个家庭作业问题,我更喜欢提示而不是实际解决方案。谢谢!

【问题讨论】:

我希望你不介意我在这里发表评论以帮助你this post you just unhappily deleted。--我不明白你认为对此的回应是不合理的,我们指出了阻止我们的错别字从回答它开始,我解释说,您似乎希望我们在可以检查时重做您的所有工作,等等。您为什么不改正错别字,展示您的工作并解释您卡在哪里?我们愿意为您提供帮助。 哦,我想你是被我的 cmets re “我认为是”冒犯了。看——我真的只是想通过指出一个常见的无益和阻碍思考/写作的习惯来帮助你提高解决问题的能力。我会找到更好的沟通方式。 【参考方案1】:

您正在使用 聚合 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 实践是使用显式的JOINs 而不是隐式语法(即在FROM 子句中用逗号分隔的表名和WHERE 子句中的连接条件)。我以这种方式修改了您的查询。

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

【讨论】:

我假设sqlplus中不允许使用表别名。 另外,这给了我一个错误,与我在问题中提到的相同:ORA-00979: not a GROUP BY expression 它指向s.total_credits @pinklemonade :对不起,我忘了将该列添加到GROUP BY 子句中,刚刚更新了我的答案。 PS:似乎现在正在理解GROUP BY 逻辑! 啊!为什么你还必须按学分分组?我不确定我是否理解。是不是因为虽然它是 GPA 属性的一部分,但它不是聚合函数的一部分? 没错。 SELECT 子句中且不属于聚合函数(SUM() 或 else)的每一列都必须出现在 GROUP BY 子句中。

以上是关于SQLPLUS - 根据每门课程的成绩、总学分和每门课程的学分计算每个学生的 GPA的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询每门课程最高分学生的学号,课程号,成绩

学生成绩

4分制gpa换算表是啥?

gpa如何换算?

查询平均成绩大于80分的课程的名字和学分.SQL语句查询,跪求高人指点!我积分不多,这次都悬赏出去了

SQL语句练习(一) 查询学生获得的总学分