【问题标题】:SQL Query to group by time and roll up and concatenate string valuesSQL 查询按时间分组并汇总和连接字符串值
【发布时间】:2021-07-19 10:26:53
【问题描述】:

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

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

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

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

我希望显示为 2 行:

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

08:00-14:15 周四/周五

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

将显示为 5 行:

13:48-14:48 M

15:48-16:48 时间

05:49-23:53 W

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 是否可以处理它。

【问题讨论】:

  • 当你将天连接成一行时,天需要是连续的吗?例如,如果星期三有不同的时间,您希望它在第一行显示 M/Tu/Th/ri,在第二行显示 W,还是在三行显示 M/Tu、W、Th/F?此外,是否总是会在一周和整周(周一至周五)报告,还是会有所不同?最后 - 如果当天没有会议怎么办?
  • @seanb - 你的第一个问题,如果星期三有不同的时间,而其他所有时间都在同一时间,我只想要 2 行,就像你提到的那样“M/Tu/Th/ri 在一行上,W on第二”。对于您的第二个问题,不必在整个星期报告,因此例如可以只在周二和周四上课,而其他日子没有条目。所以如果一天没有会议,就没有条目。例如,该程序还允许您将周六和周日添加为会议时间,但实际上这永远不会发生,因为整个数据库中都没有。
  • 用您正在使用的数据库标记您的问题。
  • 我没有在我的问题中提供的另一条注释。如果有帮助,DayOfWeek 表中有一个日期 ID 字段。它是 1-7 = 周一至周日。

标签: concatenation grouping sql-server-2016 rollup stuff


【解决方案1】:

我能够得到这个工作。这是查询:

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。

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

有时相同,有时不同:

有时相同,有时不同,日期不按顺序排列:

时代不同:

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

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

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2013-12-20
    相关资源
    最近更新 更多