【问题标题】:SQL Join - Calculate weighted students grades based on grade typeSQL Join - 根据成绩类型计算加权学生成绩
【发布时间】:2014-04-15 23:23:02
【问题描述】:

我无法根据特定成绩类型计算学生成绩。

我有以下表格

Students
----------------
stu_id
stu_fname
stu_lname

Grades
----------------
grade_id
grade_name
grade_type
grade_possible

StudentGrades
-----------------
stu_grade_id
grade_id
stu_id
grade_earned

GradeTypes
----------------
grade_type
grade_type_name
grade_weight 

我想要做的是将每种成绩类型获得的成绩总和除以每种成绩类型可能的成绩总和。然后将商乘以该等级类型的等级权重。我希望我的最终结果是每个年级类型中每个学生的计算成绩。然后我可以将它们加在一起以获得学生的最终成绩,但我必须先获得第一部分。

我是使用 sql 的新手,我不知道我是否要在一个 sql 查询中做很多事情。 这是我尝试过的,也是我尝试过的。

SELECT S.stu_fname, S.stu_lname, GT.grade_type_name, 
(sum(SG.grade_earned)/sum(G.grade_possible) * GT.grade_weight) AS Calculated Grade 
FROM Student S
INNER JOIN StudentGrade SG ON SG.stu_id = S.stu_id
INNER JOIN Grade G ON SG.grade_id = G.grade_id
INNER JOIN GradeType GT ON G.grade_type = GT.grade_type;

我得到了这样的东西

James | Fort | HW/QUIZ | 28.2 

我马上就知道这是错误的,因为 HW/QUIZ 的权重是 20%

当我分解查询并仅测试 sum(SG.grade/earned) 部分时。 我收到了所有学生成绩的总和。我希望查询一次计算单个学生的个人成绩类型的成绩。

感谢任何帮助,我被困住了。我研究了子查询和连接,需要更多帮助来缩小搜索范围以获得答案。


这是我在实施 GROUP BY 后更新的查询。我用这个查询来四舍五入我的答案。我发现我需要 4 位小数来保持答案的完整性。

Select S.stu_fname, S.stu_lname, GT.grade_type_name,         
(ROUND((SUM(SG.grade_earned)/SUM(G.grade_possible)), 2) * ROUND((GT.grade_weight/100.0)
, 2) ) as CalculatedGrade 
FROM Student S
INNER JOIN StudentGrade SG on SG.stu_id = S.stu_id
INNER JOIN Grade G on SG.grade_id = G.grade_id 
INNER JOIN GradeType GT WHERE G.grade_type = GT.grade_type
GROUP BY S.stu_fname, S.stu_lname, GT.grade_type_name;

是否可以将学生的成绩加在一起以获得每个学生的一条记录?

【问题讨论】:

    标签: mysql sql join subquery inner-join


    【解决方案1】:

    当你使用 SUM 时,你应该使用 group by,试试这个查询:

    SELECT S.stu_fname, S.stu_lname, GT.grade_type_name, 
    (sum(SG.grade_earned)/sum(G.grade_possible) * GT.grade_weight) AS Calculated Grade 
    FROM Student S
        INNER JOIN StudentGrade SG ON SG.stu_id = S.stu_id
        INNER JOIN Grade G ON SG.grade_id = G.grade_id
        INNER JOIN GradeType GT ON G.grade_type = GT.grade_type
    GROUP BY S.stu_fname, S.stu_lname, GT.grade_type_name;
    

    【讨论】:

    • 谢谢你,这似乎有效。我无法四舍五入我的答案。我已使用更新后的查询编辑了我的问题。
    • 我已经解决了舍入问题。也可以在此查询中将学生成绩添加在一起,还是我必须使用不同的查询?
    • 我发现了一个问题。我的查询并未总结特定成绩类型的所有总数。例如,等级类型 1 有 4 个与之关联的等级 ID。查询结果只求和了第一个年级的 id 而不是其他 3 个。
    • 您确定查询总和只是一年级吗?别忘了我们也有按学生分组。
    • 你是对的。我做错了数学。是否可以在查询中添加一部分以将每个学生的权重加在一起以获得最终成绩并指定字母成绩?或者看什么概念可以帮助我实现这一目标
    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多