SQL Server实现学生表与成绩表的指定格式关联输出
解决方案:按要求输出学生信息及对应成绩
要实现先显示学生信息行、再显示该学生所有成绩行的需求,关键是将学生表和成绩表的数据统一为可合并的格式,同时通过排序控制输出顺序。你之前尝试Union失败是因为未保证两个结果集的列数/格式一致,也没做排序控制。
以下是完整的SQL实现:
SELECT OutputLine FROM ( -- 生成学生信息行:每个有成绩的学生只输出一次 SELECT CAST(s.ID AS VARCHAR) + ', ' + s.Name + ', ' + s.Attendance + ', ' + s.Class AS OutputLine, s.ID, 1 AS SortOrder, NULL AS LessonSort FROM STUDENTS s INNER JOIN RESULTS r ON s.ID = r.ID GROUP BY s.ID, s.Name, s.Attendance, s.Class UNION ALL -- 生成成绩行:关联学生表确保只保留有对应学生的成绩 SELECT CAST(r.ID AS VARCHAR) + ', ' + r.Lesson + ', ' + r.Result AS OutputLine, r.ID, 2 AS SortOrder, r.Lesson AS LessonSort FROM RESULTS r INNER JOIN STUDENTS s ON r.ID = s.ID ) AS CombinedData -- 排序规则:先按学生ID分组,学生行在前,成绩行在后,成绩行按课程名排序 ORDER BY ID, SortOrder, LessonSort
代码说明:
- INNER JOIN:确保只包含有成绩记录的学生,符合你“无成绩的学生不纳入结果”的要求。
- GROUP BY:避免同一学生因对应多条成绩而重复输出学生信息行。
- SortOrder字段:标记学生行(1)和成绩行(2),保证学生行始终排在对应成绩行的前面。
- LessonSort字段:对同一学生的成绩行按课程名排序,让输出更规整(和你示例中的顺序逻辑一致)。
执行这段SQL后,就能得到你期望的输出格式:
1, abc, good, 1A 1, Read, Pass-67% 1, Sing, Pass-99% 1, Write, Pass-89% 2, xyz, bad, 1B 2, Read, Pass-75% 3, dsk, good, 1A 3, Read, Pass-55% 3, Sing, Fail-47% 4, uij, bad, 1B 4, Sing, Fail-10% 4, Write, Pass-90%
内容的提问来源于stack exchange,提问作者KMoe
相关产品推荐
相关产品推荐

