Show every week of the Year even if there is no data

后端 未结 1 1473
独厮守ぢ
独厮守ぢ 2021-01-26 14:46

I have query that pulls data by week and groups it together. But i does not display weeks that doesn\'t have any data. I want show all weeks even if they don\'t have data as nul

相关标签:
1条回答
  • 2021-01-26 15:28

    You probably need a calendar table. Here is a quick way of generating one, with an untested implementation of your code. I am assuming that the StartDate may contain a time component thus the need to coalesce the dates.

    DECLARE @StartYear DATETIME = '20200101'
    DECLARE @days      INT      = 366
    
    ;WITH
      E1(N) AS (
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
      ),                                   -- 1*10^1 or 10 rows
      E2(N) AS (SELECT 1 FROM E1 a, E1 b), -- 1*10^2 or 100 rows
      E4(N) AS (SELECT 1 FROM E2 a, E2 b), -- 1*10^4 or 10,000 rows
      E8(N) AS (SELECT 1 FROM E4 a, E4 b), -- 1*10^8 or 100,000,000 rows
      Tally(N) AS (SELECT TOP (@Days) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E8),
      Calendar AS (
        SELECT  StartOfDay = DATEADD(dd,N-1,@StartYear),
                EndOfDay   = DATEADD(second, -1, DATEADD(dd,N  ,@StartYear))
        FROM Tally)
    
    SELECT  DATEADD (week, datediff(week, 0, COALESCE(x.StartDate, c.StartOfDay) ), -1) as 'WeekOf'
          , DATEADD (week, datediff(week, 0, COALESCE(x.StartDate, c.StartOfDay)), +5) as 'to'
          , DATEPART(wk, COALESCE(x.StartDate, c.StartOfDay)) as 'WeekNumber'
    FROM    Calendar c
            INNER JOIN [DESOutage].[dbo].[OPSInterruption] x
                    ON x.StartDate > c.StartOfDay AND x.StartDate <= c.EndOfDay
    WHERE   c.StartOfDay > '2020-01-01' AND c.StartOfDay <'2020-02-01' 
    GROUP BY DATEADD (week, datediff(week, 0, COALESCE(x.StartDate, c.StartOfDay)), -1),
             DATEPART(wk, COALESCE(x.StartDate, c.StartOfDay)),
             DATEADD (week, datediff(week, 0, COALESCE(x.StartDate, c.StartOfDay)), +5)
    
    0 讨论(0)
提交回复
热议问题