首页 > 解决方案 > 注册的类似表将天分成行,将它们格式化为列

问题描述

我有一个表,其中包含具有以下行的班级中的学生注册:

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 都会很棒!

标签: sqlpostgresqlsqlalchemy

解决方案


您可以使用下面的 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

推荐阅读