Sql server 在T-SQL中组合日期重叠的行

Sql server 在T-SQL中组合日期重叠的行,sql-server,tsql,Sql Server,Tsql,我有一些类似以下的数据: 基础数据 我想转换数据,以便每个学生在每个时间段都有一行,以及一系列课程,即 目标输出 我有一个脚本,如果日期相同,可以使用课程字段中的内容,并根据下面的学生/日期代码进行分组。但我不知道如何处理重叠的日期 Select Student, Courses = STUFF((select ',' + course from Table1 b where a.student = b.stud

我有一些类似以下的数据:

基础数据 我想转换数据,以便每个学生在每个时间段都有一行,以及一系列课程,即

目标输出 我有一个脚本,如果日期相同,可以使用课程字段中的内容,并根据下面的学生/日期代码进行分组。但我不知道如何处理重叠的日期

Select Student,
       Courses =
       STUFF((select ',' + course
              from Table1 b
              where a.student = b.student
              for XML PATH('')
              ),1,1,''
             )
        
        from table1 a
        Group by student

这有点啰嗦,因为你需要得到约会的分组。由于日期不重叠,您还需要对一些分组进行一些消除,因此需要进行几次扫描

我使用CTE获取所需的组,然后使用子查询在较新版本的SQL Server上进行字符串聚合。您可以使用string_AGG,而不需要对表进行第二次扫描。结果是:

以你的桌子为例 挑选* 来自值“John”、“CONVERTdate”、“01-Jan-20”、“CONVERTdate”、“30-Sep-20”、“Business”, “约翰”,“CONVERTdate”,“01-Jan-20”,“CONVERTdate”,“30-Dec-20”,“心理学”, “John”,CONVERTdate,“01-10-20”,CONVERTdate,空,“Music”, “Jack”,CONVERTdate,“20年2月1日”,CONVERTdate,“20年9月30日”,“业务”, “杰克”,CONVERTdate,“20年4月1日”,CONVERTdate,“20年11月30日”,“音乐”学生,开始日期,结束日期,课程, 日期为 选择不同的V.学生,V.[日期] 从你的桌子上 交叉应用值Y.学生,Y.起始日期, 本年度学生,本年度结束日期VStudent,[日期], 岛屿作为 选择*, LEADISNULL[Date],'99991231'按学生顺序按ISNULL[Date]进行分区,'99991231'作为下一个日期 从日期开始 其中[日期]不为空, 组作为 选择I.学生, I.起始日期, 案例DATEPARTDAY,I.NextDate当1时,然后DATEADDDAY,-1,I.NextDate否则I.NextDate结束为EndDate, 填充选择“,”+YT.课程 从你的桌子上 其中YT.Student=I.Student 并且YT.StartDate=I.NextDate或YT.EndDate为空 按YT订购。当然 对于XML路径,键入.value'/text[1]'、'nvarcharMAX',1,1作为路径 来自I岛 选择学生, 开始日期, 结束日期, 课程 来自团体 何处[起始日期]!=EndDate或EndDate为空 而且课程不是空的 由学生描述订购, 起始日期ASC;
到目前为止你试过什么?为什么不起作用?你看过STRING_AGG吗?关于如何在SQL Server上的堆栈溢出中创建分隔结果,有很多示例,为什么这些示例对您没有帮助?@Larnu这不仅仅是一个字符串agg问题,还需要一个间隙和孤岛component@Larnu-在没有真正理解问题的情况下漫无边际的评论对任何人都没有帮助。无论如何,要给他们指出正确的方向,让他们自己找到解决方案,但是给他们提供解决方案中最简单的部分中最小的部分,他们已经能够根据他们提到的内容来做,因为你没有正确阅读问题,这是没有建设性的。指向的链接实际上会有所帮助。我已经添加了当前代码,用于创建课程的分隔输出。正如@Larnu所说的,这不是我正在努力解决的问题,而是日期元素。感谢Larnu提供的建设性帮助-我将回顾该链接,看看是否可以取得进展further@Roo别担心,有一个裂缝的差距和岛屿,如果你仍然卡住了修改你的问题,给我一个平。
Student Start Date  End Date    Course
John    01-Jan-20   30-Sep-20   Business, Psychology
John    01-Oct-20   30-Dec-20   Psychology, Music
John    01-Jan-21   NULL        Music
Jack    01-Feb-20   31-Mar-20   Business
Jack    01-Apr-20   30-Sep-20   Business, Music
Jack    01-Oct-20   30-Nov-20   Music
Select Student,
       Courses =
       STUFF((select ',' + course
              from Table1 b
              where a.student = b.student
              for XML PATH('')
              ),1,1,''
             )
        
        from table1 a
        Group by student