【问题标题】:SQL insert dayofweek information in each day column without nullSQL 在每一天的列中插入星期几信息,不为空
【发布时间】:2013-11-17 15:18:17
【问题描述】:

这是我的 [资源表] 我正在获取我的数据:

Start Date                 Time From  Time To  Time From To    Training Room
2011-05-24 00:00:00.000    8:00       23:00    8:00 - 23:00    Room1
2011-05-25 00:00:00.000    1:00       23:00    1:00 - 23:00    Room1
2011-05-26 00:00:00.000    1:00       23:00    1:00 - 23:00    Room1
2011-05-04 00:00:00.000    20:00      23:00   20:00 - 23:00    Room2
2011-05-05 00:00:00.000    20:00      22:00   20:00 - 22:00    Room2
2011-05-20 00:00:00.000    20:00      23:00   20:00 - 23:00    Room3
2011-05-21 00:00:00.000    17:00      19:00   17:00 - 19:00    Room2

我想要填充这张表 [FACT Training]:

但是我在填充没有空值的表时遇到了问题。 由于我想向每一天的列插入数据,因此只插入特定的星期几名称:

WHERE datename(dw,[Start Date]) = 'Monday'
WHERE datename(dw,[Start Date]) = 'Tuesday'
etc...

所以我的插入看起来像这样:

但需要每天过滤...

【问题讨论】:

    标签: sql insert calendar sql-update weekday


    【解决方案1】:

    查看您描述的问题,我一开始只将列值放入正确的星期几,这将创建 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])的声明,因为您不必为了查看它们而显示它们。

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2021-09-06
      • 2015-07-24
      • 2020-12-14
      • 1970-01-01
      相关资源
      最近更新 更多