【发布时间】: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