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

Concatenation SQL查询按时间分组、汇总和连接字符串值,concatenation,grouping,sql-server-2016,rollup,stuff,Concatenation,Grouping,Sql Server 2016,Rollup,Stuff,我试图从两个表之间的一组时间和天数中获取特定格式 数据库: 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 结果: 我希望这组数据

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

数据库: 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
结果:

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

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

注意,上面的开始时间和结束时间可以是上面单独的列,主要目标是显示每个分组时间的一周天数

活动扳手是指时间可以完全不同或相同。例如,此数据集:

我希望显示为两行:

07:35-14:15米/吨/瓦

08:00-14:15三楼

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

将显示为5行:

13:48-14:48米

15:48-16:48 T

05:49-23:53西

14:49-16:49第

13:49-16:49华氏度

我对《泰晤士报》的分组没有多大成功。我确实找到了如何使用“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, 1)
            ELSE NULL
        END)
      FROM MeetingTime m
        Inner Join [DayOfWeek] d on d.Id = m.DayOfWeekId
        Where m.ClassId = class.Id
      FOR XML PATH('')), 1, 1, '') [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, 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('')), 1, 1, '') [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.EndTime, t.ClassId
显然,硬编码的Id会让您想要创建一个变量

开始和结束时间相同的结果:

有时相同,有时不同:

有时是相同的,有时是不同的,但时间顺序不同:

时代不同:

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


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

当您将日期连接到一行中时,日期是否需要连续?e、 例如,如果星期三的时间不同,您希望它在一行上显示M/Tu/Th/ri,在第二行上显示W,还是在三行上显示M/Tu,W,Th/F?此外,是否总是在一周和整个星期(星期一至星期五)进行报告,或者这会有所不同?最后-如果一天没有会议怎么办?@seanb-你的第一个问题,如果我们有不同的时间,所有其他时间都是相同的,我只想要两排,就像你提到的“一排是M/Tu/Th/ri,第二排是W”。对于你的第二个问题,它不需要在一整周内报告,因此一节课可以是周二和周四,其他几天没有条目。因此,如果一天内没有会议,就不会有条目。例如,该程序允许您将Sat和Sun也添加为会议时间,但实际上这种情况从未发生过,因为整个数据库中都没有。请使用您正在使用的数据库标记您的问题。我在问题中未提供的另一个注释。如果有帮助,DayOfWeek表中有一个day Id字段。现在是星期一到星期七。