Sql pivot变换持续数周

Sql pivot变换持续数周,sql,tsql,sql-server-2008-r2,pivot,pivot-table,Sql,Tsql,Sql Server 2008 R2,Pivot,Pivot Table,对于给定的confirmationId,我必须在所有周内将行转换为列,但在我的查询中,它只在一周内进行转换,但在单个ID下存在几个周。 ` 我需要以下表格中的结果: ConfirmationId weekstartdate weekenddate Monday Tuesday Wednesday Thursday Friday Saturday Sunday 1 16/07/2007 23/07/2007 NULL NULL 8

对于给定的confirmationId,我必须在所有周内将行转换为列,但在我的查询中,它只在一周内进行转换,但在单个ID下存在几个周。 `

我需要以下表格中的结果:

ConfirmationId  weekstartdate   weekenddate Monday  Tuesday Wednesday Thursday Friday Saturday Sunday
    1           16/07/2007      23/07/2007  NULL    NULL    8         8        8      NULL     NULL
    1           24/07/2007      30/07/2007  8       8       8         8        8      NULL     NULL
    2           18/06/2007      24/06/2007  NULL    NULL    NULL      NULL     8      NULL     NULL
    2           25/06/2007      1/07/2007   8       8       8         NULL     NULL   NULL     NULL
    2           2/07/2007       8/07/2007   8       8       NULL      8        8      NULL     NULL
到目前为止,我所尝试的:

select Confirmationid,[Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday],[Sunday]
from
(
Select confirmationid,WorkingHours,TimeSheetDate,[DayName] from #temp1
) d
pivot(
min(WorkingHours) for
[DayName] in ([Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday],[Sunday])
)piv order by ConfirmationId
这给了我一个结果:这是完全错误的


您应该使用日历表获取一周的第一天和最后一天。选择cte中的所有相关字段,然后从中透视:

;WITH cte AS (SELECT    ConfirmationId
                      , DayName
                      , WorkingHours 
                      , b.FirstDateOfWeek
                      , b.LastDateOfWeek
               FROM  #temp1 a
               JOIN tlkp_Calendar b
                 ON a.TimeSheetDate = b.CalendarDate
              )
SELECT * 
FROM  cte
PIVOT(MIN(WorkingHours) 
      FOR [DayName] IN ([Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday],[Sunday])
     )pvt 
ORDER BY ConfirmationId

我没有这个tlkp_日历表,我相信您已经生成了这个表。是的,您需要生成一个日历表,有许多脚本可用于生成日历表,它们是非常宝贵的工具。
;WITH cte AS (SELECT    ConfirmationId
                      , DayName
                      , WorkingHours 
                      , b.FirstDateOfWeek
                      , b.LastDateOfWeek
               FROM  #temp1 a
               JOIN tlkp_Calendar b
                 ON a.TimeSheetDate = b.CalendarDate
              )
SELECT * 
FROM  cte
PIVOT(MIN(WorkingHours) 
      FOR [DayName] IN ([Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday],[Sunday])
     )pvt 
ORDER BY ConfirmationId