SQL Case表达式同列判断失效 如何按选课为学生返回唯一编码
问题原因
你的原查询存在三个核心问题:
- 逐行判断逻辑不可能识别双课组合:每一行课程记录仅对应一个
CourseCode,CourseCode = '100001' and CourseCode = 'BH0001'这类条件永远不可能成立,所以双课分支永远不会触发。 - 没有按学生聚合:没有对
StudentID做分组操作,一个学生选了几门课就会返回几条记录,自然得不到合并后的单条结果。 - 分支优先级错误:就算逻辑成立,你把单课判断放在组合判断前面,会优先命中单课分支,也走不到组合判断的逻辑。
解决方案
先按学期、学生ID分组聚合,先判断双课组合的场景,再匹配单课场景即可,参考查询语句如下:
SELECT StudentID, CASE -- 优先判断双课组合 WHEN COUNT(CASE WHEN CourseCode = '100001' THEN 1 END) = 1 AND COUNT(CASE WHEN CourseCode = 'BH0001' THEN 1 END) = 1 THEN 'BH01' WHEN COUNT(CASE WHEN CourseCode = '400001' THEN 1 END) = 1 AND COUNT(CASE WHEN CourseCode = 'BH0002' THEN 1 END) = 1 THEN 'BH04' -- 再判断单课场景 WHEN COUNT(CASE WHEN CourseCode = '100001' THEN 1 END) = 1 THEN 'AAN1' WHEN COUNT(CASE WHEN CourseCode = '400001' THEN 1 END) = 1 THEN 'AAN4' WHEN COUNT(CASE WHEN CourseCode = 'BH0001' THEN 1 END) = 1 THEN 'BABH' WHEN COUNT(CASE WHEN CourseCode = 'BH0002' THEN 1 END) = 1 THEN 'BPBH' END AS CustomCode FROM Courses GROUP BY TermCode, StudentID ORDER BY StudentID;
逻辑说明
GROUP BY TermCode, StudentID保证同一个学期的同一个学生仅返回1条记录- 用
COUNT(CASE WHEN 课程条件 THEN 1 END)来统计学生是否修了对应课程,聚合后可以识别多课程的组合场景 - 组合判断放在单课判断前面,避免优先级错误导致组合分支不触发
执行上述查询即可得到你期望的结果。
内容的提问来源于stack exchange,提问作者RAR
相关产品推荐
相关产品推荐

