SQL查询 - 学生加权成绩计算

时间:2014-04-23 21:21:18

标签: mysql sql join subquery

我在计算学生成绩以获得最终成绩时遇到困难。

我有以下表格

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 

这是我能够提出的查询

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;

我收到下面的查询报告

James | Fort | HW/QUIZ | 30.0 
James | Fort | LogBook | 60.0 
Robin | Hood | HW/QUIZ | 60.0 
Robin | Hood | Logbook | 25.0 

我希望能够将两个詹姆斯Forts成绩加在一起,以获得他的最终成绩和Robin Hood的成绩。

感谢任何帮助,我在这一点上陷入困​​境。我差不多完成了。我已经研究过子查询,需要更多帮助来缩小搜索范围以获得答案。

2 个答案:

答案 0 :(得分:1)

您是否尝试过以下操作?

SELECT results.stu_fname, results.stu_lname, sum(results.CalculatedGrade)
FROM(  
     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
)results
GROUP BY results.stu_fname, results.stu_lname;

编辑:感谢AshReva的评论,添加了别名。

答案 1 :(得分:0)

好吧,只需从GT.grade_type_nameselect移除group by即可。这样做你需要的吗?

Select S.stu_fname, S.stu_lname,     
       (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
     on G.grade_type = GT.grade_type
GROUP BY S.stu_fname, S.stu_lname;