在SSMS中实现可汗学院Gradebook Challenge SQL代码遇阻求指导
问题分析与解决
你的代码核心问题有两个:
- 按**具体分数
Grade**分组,这会把每个不同的分数单独分成一组,和可汗学院挑战要求的「统计各字母等级的学生人数」目标不符; - SQL Server不允许在
GROUP BY中直接引用SELECT里定义的列别名,所以即使逻辑正确,也会报错。
修改方案一:重复CASE表达式到GROUP BY
直接将SELECT中的CASE逻辑复制到GROUP BY中,同时去掉不需要的Grade列(因为我们要按字母等级聚合,而非具体分数):
SELECT COUNT(*) AS StudentCount, CASE WHEN Grade > 90 THEN 'A' WHEN Grade > 80 THEN 'B' WHEN Grade > 70 THEN 'C' ELSE 'F' END AS LetterGrade FROM StudentsGrades GROUP BY CASE WHEN Grade > 90 THEN 'A' WHEN Grade > 80 THEN 'B' WHEN Grade > 70 THEN 'C' ELSE 'F' END
修改方案二:使用CTE(更易读)
先用CTE(公共表表达式)生成包含字母等级的中间结果,再对中间结果分组统计,避免重复写CASE逻辑:
WITH GradesWithLetter AS ( SELECT CASE WHEN Grade > 90 THEN 'A' WHEN Grade > 80 THEN 'B' WHEN Grade > 70 THEN 'C' ELSE 'F' END AS LetterGrade FROM StudentsGrades ) SELECT COUNT(*) AS StudentCount, LetterGrade FROM GradesWithLetter GROUP BY LetterGrade
以上两种方案都能得到各字母等级的学生人数统计结果,和可汗学院的挑战要求一致。
内容的提问来源于stack exchange,提问作者user21057499
相关产品推荐
相关产品推荐

