SQL 查询按时间分组并汇总和连接字符串值

问题描述

我正在尝试从两个表之间的一组时间和天数中获取特定格式。

数据库: MeetingTime 表具有从 MeetingTime.DayOfWeekId(外键)到表 DayOfWeek.Id(主键)的关系。示例查询

select t.ClassId,d.Name,t.StartTime,t.EndTime
From MeetingTime t
Inner Join DaysOfWeek d on d.Id = t.DayOfWeekId
Where t.classId = 8

结果:

enter image description here

我希望这组数据的结果是一行,因为开始和结束时间相同。

09:00-15:35 M/T/W/Th/F

注意,上面的开始和结束时间可以在上面单独列,主要目标是显示每个分组时间的星期几。

猴子扳手是时间可以完全不同或相同。例如这个数据集:

enter image description here

我希望显示在 2 行中:

07:35-14:15 M/T/W

08:00-14:15 Th/F

最后,这个所有时间都不同的数据集:

enter image description here

显示在 5 行中:

13:48-14:48 M

15:48-16:48 T

05:49-23:53 W

14:49-16:49 日

13:49-16:49 F

我在分组时间方面没有取得太大的成功。我确实想出了如何使用“Stuff”运算符将一周中的几天连接到一列中,但还没有结合开始和结束时间的分组。

连接和汇总天数:

   STUFF((SELECT '/ ' + 
      (CASE
            WHEN d.[Name] = 'Thursday' THEN SUBSTRING(d.[Name],1,2)
            WHEN d.[Name] = 'Sunday' THEN 'U'
            WHEN d.[Name] != '' THEN SUBSTRING(d.[Name],1)
            ELSE NULL
        END)
      FROM MeetingTime m
        Inner Join [DayOfWeek] d on d.Id = m.DayOfWeekId
        Where m.ClassId = class.Id
      FOR XML PATH('')),'') [ClassSchedule]

我也不反对在 C# 代码中只返回行并处理数据操作,而是想看看 sql 是否可以处理它。

解决方法

我能够完成这项工作。这是查询:

select 
t.ClassId,t.StartTime,t.EndTime,STUFF((SELECT '/' + (CASE
                        WHEN w.[Name] = 'Thursday' THEN SUBSTRING(w.[Name],1,2)
                        WHEN w.[Name] = 'Sunday' THEN 'U'
                        WHEN w.[Name] != '' THEN SUBSTRING(w.[Name],1)
                        ELSE NULL
                    END)
      From MeetingTime s
      Inner Join DayOfWeek w on w.Id = s.DayOfWeekId
      Where s.classId = 7 and s.DayOfWeekId > 0 
      and s.StartTime = t.StartTime 
      and s.EndTime = t.EndTime
      FOR XML PATH('')),'') [ClassSchedule]
From MeetingTime t
Inner Join DayOfWeek d on d.Id = t.DayOfWeekId
Where t.classId = 7 and t.DayOfWeekId > 0
Group by t.StartTime,t.ClassId

显然是硬编码的 ID,您想创建一个变量。

开始和结束时间都相同的结果: enter image description here

有时相同,有时不同: enter image description here

有时相同,有时不同,日期不按顺序: enter image description here

时代不同了:

enter image description here

只有周一/周三/周五的时间。

enter image description here

我对此感觉很好,但我想修复上面结果图像的顺序,其中所有时间都不同且日期不按时间顺序排列。