sql - 注册的类似表将天分成行,将它们格式化为列
问题描述
我有一个表,其中包含具有以下行的班级中的学生注册:
Enrollment_id | Student_id | ... | Day | start_time | end_time| Location
对于注册数学 101 的学生,例如,可能是在周二的周一下午 2 点到下午 4 点,以及周四的下午 4 点到下午 5 点,表中将包含以下数据。
1 | x | 'Monday' | 14:00:00 | 16:00:00 | 'Class Room x'
1 | x | 'Tuesday' | 14:00:00 | 16:00:00 | 'Class Room x'
1 | x | 'Thursday' | 16:00:00 | 17:00:00 | 'Class Room x'
我需要为此创建一个导出,将学生注册的格式设置如下:
Student_id | ... | M | T | W | T | F | Time | Location
x | ... | Y | Y | N | N | N | '14:00:00 - 16:00:00 | 'Class Room X'
x | ... | N | N | N | Y | N | '16:00:00 - 17:00:00 | 'Class Room X'
因此,必须按 student_id、一些课程信息,然后按时间进行分组。分组后,它会在星期一/星期二等创建。列并放置一个 Y / N 如果他们那天有该课程。这也是按特定时间计算的,因此同一个班级可能在不同的日子有不同的时间(IE 实验室和课堂讲座),这些时间会是不同的行。
寻求有关如何将其编写为子查询的帮助。很高兴提供有关桌子或周围其他桌子的其他信息。不过,我对此感到困惑,我什至不确定这是否可能。目前,这是在使用 Sqlalchemy 的 Python api 中完成的,因此无论是作为 sqlalchemy 还是原始 sql 都会很棒!
解决方案
您可以使用下面的 CASE 表达式。
SELECT student_id,
ISNULL(MAX(CASE WHEN DAY = 'Monday'
THEN 'Y'
END),'N') AS 'M',
ISNULL(MAX(CASE WHEN DAY = 'Tuesday'
THEN 'Y'
END),'N') AS 'T',
ISNULL(MAX(CASE WHEN DAY = 'Wednesday'
THEN 'Y'
END),'N') AS 'W',
ISNULL(MAX(CASE WHEN DAY = 'Thursday'
THEN 'Y'
END),'N') AS 'T',
ISNULL(MAX(CASE WHEN DAY = 'Friday'
THEN 'Y'
END),'N') AS 'F',
CONCAT(Start_time,'-',end_time) as Time,
Location
FROM student
GROUP BY student_id,CONCAT(Start_time,'-',end_time),Location
基于您的样本数据的结果集
student_id M T W T F Time Location
x Y Y N N N 14:00:00-16:00:00 Class Room x
x N N N Y N 16:00:00-17:00:00 Class Room x
推荐阅读
- c# - 为什么我的 ImageButton 没有动态更新?
- azure - 通过 Visual Studio 2019 将逻辑应用部署到 Azure
- javascript - 模态图片库 - 多张图片不会显示
- excel-formula - 从单元格中的值引用数组
- python - 如何从“jetson.inference.detectNet.Detection”类型中获取单独的值?
- java - 使用 ProcessBuilder 运行 Java 主类
- scala - 如何减少 Spark 中的 List[Key, List[Name, Value]]?
- c++ - GCC 原生矩阵运算库
- android - 如何在 Flutter 中制作透明的应用程序?
- react-native - React Navigation 5 隐藏抽屉项目