编写SELECT查询实现行转列:查询Blue班级学生选课信息
解决方案
静态列实现(适合已知目标科目)
如果已经明确需要展示的科目(Geography、Science、English、History),可以使用条件聚合实现行转列,SQL语句如下:
SELECT s.`Last Name`, s.`First Name`, MAX(CASE WHEN c.Class = 'Geography' THEN 1 END) AS Geography, MAX(CASE WHEN c.Class = 'Science' THEN 1 END) AS Science, MAX(CASE WHEN c.Class = 'English' THEN 1 END) AS English, MAX(CASE WHEN c.Class = 'History' THEN 1 END) AS History FROM `Class Groups` cg JOIN Students s ON cg.ID = s.ClassID LEFT JOIN Class_attendees ca ON s.ID = ca.Student_ID LEFT JOIN Classes c ON ca.`Class ID` = c.ID WHERE cg.`Class Name` = 'Blue' GROUP BY s.ID, s.`Last Name`, s.`First Name` ORDER BY s.`Last Name`;
逻辑说明:
- 表关联:通过
Class Groups筛选Blue班级学生,再关联Students、Class_attendees、Classes获取选课信息; - 条件聚合:用
CASE WHEN标记学生是否选修对应科目(选中为1,未选为NULL),通过MAX聚合将同一学生的多行选课记录合并为一行; - 分组排序:按学生ID、姓名分组确保每行对应一个学生,最后按姓氏排序。
动态列实现(自动适配有学生选修的科目)
如果需要自动排除无人选修的科目(比如示例中的Spanish),可以用动态SQL生成查询语句(以MySQL为例):
-- 第一步:获取Blue班级学生实际选修的科目,拼接列语句 SET @cols = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN c.Class = ''', c.Class, ''' THEN 1 END) AS `', c.Class, '`')) INTO @cols FROM `Class Groups` cg JOIN Students s ON cg.ID = s.ClassID JOIN Class_attendees ca ON s.ID = ca.Student_ID JOIN Classes c ON ca.`Class ID` = c.ID WHERE cg.`Class Name` = 'Blue'; -- 第二步:生成并执行动态查询 SET @query = CONCAT(' SELECT s.`Last Name`, s.`First Name`, ', @cols, ' FROM `Class Groups` cg JOIN Students s ON cg.ID = s.ClassID LEFT JOIN Class_attendees ca ON s.ID = ca.Student_ID LEFT JOIN Classes c ON ca.`Class ID` = c.ID WHERE cg.`Class Name` = ''Blue'' GROUP BY s.ID, s.`Last Name`, s.`First Name` ORDER BY s.`Last Name`; '); PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt;
逻辑说明:
- 动态生成列:先查询Blue班级学生选修的所有科目,用
GROUP_CONCAT拼接每个科目的聚合判断语句; - 执行动态SQL:将拼接好的列语句插入主查询,自动只显示有学生选修的科目。
最终输出结果
两种方法都会得到符合需求的结果:
| Last Name | First Name | Geography | Science | English | History |
|---|---|---|---|---|---|
| Baggins | Frodo | 1 | 1 | 1 | |
| Cooper | Sarah | 1 | 1 | 1 | |
| Moody | Claire | 1 | 1 | 1 |
内容的提问来源于stack exchange,提问作者Amused
相关产品推荐
相关产品推荐

