enrollment的like表将天数拆分为行,改为列格式

uyhoqukh  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(272)

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

Enrollment_id | Student_id | ... | Day | start_time | end_time| Location

对于一个注册了saymath101的学生来说,比如周一到周二下午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'

所以按学号,一些课程信息,然后按时间分组是很重要的。一旦分组,它将创建本周一/周二等。列,如果当天有该类,则输入y/n。这也是由特定的时间决定的,所以同一个班级在不同的日子可能有不同的时间(即实验室和课堂讲座),这些时间可能是不同的行。
正在寻找有关如何将其作为子查询编写的帮助。很乐意提供关于表或其他表的附加信息。不过,这件事让我很为难,我甚至不确定这是否可能。目前,这是在Python API中使用SQLalCyy完成的,太好了!

rnmwe5a2

rnmwe5a21#

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

kulphzqa2#

我认为您需要条件聚合:

select student_id, time, location,
       max(case when day = 'Monday' then 'Y' else 'N' end) as mon,
       max(case when day = 'Tuesday' then 'Y' else 'N' end) as tue,
       . . .
from t
group by student_id, time, location;

因为你用的是postgres,所以我建议你每天使用booleans而不是字符。结果是更简单的:

select student_id, time, location,
       bool_or(day = 'Monday') as mon,
       bool_or(day = 'Tuesday') as tue,
       . . .
from t
group by student_id, time, location;

相关问题