查看您描述的问题,我一开始只将列值放入正确的星期几,这将创建 7 行,每行仅填充 [Start Date] 所在的那一天的列。
SELECT
[Monday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Monday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Tuesday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Tuesday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Wednesday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Wednesday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Thursday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Thursday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Friday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Friday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Saturday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Saturday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
,[Sunday] =
CASE WHEN DATENAME(DW,[Start Date]) = 'Sunday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END
FROM
[Resource table]
但后来我想,您可能希望将所有这些显示在一行中,在这种情况下,您需要按某个或多个值对它们进行分组。我不知道用于为组创建列值串联列表的 SQL 聚合函数,因此您可能需要创建一个,但您可以按培训室对它进行分组,如果每次培训每天只有一个条目room 可以使用类似下面的东西(SQL 纯粹主义者现在可能想把目光移开):
SELECT
[Week Id] = CONVERT(VARCHAR,DATEPART(YEAR,[Start Date])) + '-' + CONVERT(VARCHAR,DATEPART(WEEK,[Start Date]))
,[Training Room]
,[Monday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Monday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Tuesday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Tuesday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Wednesday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Wednesday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Thursday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Thursday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Friday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Friday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Saturday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Saturday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
,[Sunday] = MAX(CASE WHEN DATENAME(DW,[Start Date]) = 'Sunday' THEN ISNULL([Training Room],'') + N' - ' + [Time From To] ELSE '' END)
FROM
[Resource table]
GROUP BY
CONVERT(VARCHAR,DATEPART(YEAR,[Start Date])) + '-' + CONVERT(VARCHAR,DATEPART(WEEK,[Start Date]))
,[Training Room]
您总是可以省略我分组的两个初始列([Week Id] 和 [Training Room])的声明,因为您不必为了查看它们而显示它们。