如何编写SQL实现考试成绩行转列并计算各科目平均分
问题背景
涉及的examresults成绩表共4个字段:
stid:学生IDterm:学段subjects:科目score:分数
当前表内存储了stid为STD-1的学生共6条成绩记录,覆盖Term 1、Terminal两个学段的英语、数学、科学三科成绩。需要以科目为行维度,输出每行对应科目的TERM ONE成绩、TERMINAL成绩、两学段平均分。
原尝试执行的SQL存在DISTINCT与GROUP BY逻辑混用、未做跨学段值聚合的问题,无法得到预期结果:
SELECT DISTINCT(subject),score FROM `examresults` WHERE stid='STD-1' GROUP BY subject,term
正确SQL实现
用条件聚合+按科目分组的逻辑即可实现行转列需求,语句如下:
SELECT subjects AS 科目, MAX(CASE WHEN term = 'Term 1' THEN score END) AS `TERM ONE成绩`, MAX(CASE WHEN term = 'Terminal' THEN score END) AS `TERMINAL成绩`, AVG(score) AS `两学段平均分` FROM examresults WHERE stid = 'STD-1' GROUP BY subjects;
逻辑说明
- 按
subjects字段分组后,每个分组对应当前学生的一个科目,天然满足“科目为行维度”的要求 - 分组内通过
CASE WHEN匹配学段值提取对应分数,由于每个科目对应每个学段仅存在1条成绩记录,用MAX()即可准确取到对应学段的分数,不需要额外去重 - 平均分直接调用
AVG()聚合函数,会自动计算当前科目分组下所有成绩的平均值 - 如果表内存储的学段字符串大小写、拼写和示例不一致,只需调整
CASE WHEN后的匹配值即可正常运行
内容的提问来源于stack exchange,提问作者Mostan
相关产品推荐
相关产品推荐

