小编典典

如何在SQL Server 2008中使用Weekno获取六周的星期日计数?

sql

我需要计算周数。它工作正常,但我不知道是[34],[35],[36],[37],[38],[39]的Weekno。Weekno仅在运行时知道,例如一年中总共有52周。我从@Bluefeet的帮助下获得了此查询,他在同一stackoverflow上发布了该查询。如果我更改之间的字段中的开始日期和日期,则不起作用。因为我在下面的查询中对weekno进行了硬编码。无论一年中介于哪个字段之间的日期,请给我解决方案。

SET DATEFIRST 1 
SELECT case when InstanceType is not null then InstanceType else 'Sum' End InstanceType ,  
  sum([34]) AS FirstWeek, 
  sum([35]) AS SecondWeek, 
  sum([36]) AS ThirdWeek, 
  sum([37]) AS FourthWeek, 
  sum([38]) AS FifthWeek, 
  sum([39]) AS SixthWeek,  
  max(InstanceDescription) AS InstanceDescription 
FROM 
( 
  SELECT [SPGI01_INSTANCE_TYPE_C] AS InstanceType, 
    [34], [35], [36], [37], [38], [39], InstanceDescription  
  FROM 
  ( 
    SELECT I01.[SPGI01_INSTANCE_TYPE_C], 
      DatePart(wk, I01.[SPGI01_CREATE_S]) WeekNo, 
      DATEADD(DAY, 7 -DATEPART(WEEKDAY,I01.[SPGI01_CREATE_S]),  I01.[SPGI01_CREATE_S]) WeekEnd, 
      J03.SPGJ03_MSG_TRANSLN_X InstanceDescription  
    FROM [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY] I01  
    INNER JOIN [SUPER-G].[dbo].[CSPGI50_VALID_INSTANCE_TYPE] I50 
      ON I50.[SPGI50_INSTANCE_TYPE_C] = I01.[SPGI01_INSTANCE_TYPE_C]  
    LEFT JOIN CSPGJ02_MSG_OBJ J02 
      ON I50.SPGJ02_MSG_K = J02.SPGJ02_MSG_K  
    LEFT JOIN CSPGJ03_MSG_TRANSLN J03 
      ON J02.SPGJ02_MSG_K = J03.SPGJ02_MSG_K  
    where I50.[SPGA04_RATING_ELEMENT_D] = 1  
      and I01.[SPGI01_EXCEPTIONED_F] = 'N' 
      and I01.[SPGI01_DISPUTED_F] != 'Y'  
      AND J03.[SPGJ03_LOCALE_C] =  'en_US'  
      and I01.[SPGA02_BUSINESS_TYPE_C] = 'PROD'  
      and I01.[SPGA03_REGION_C] = 'EU'  
      and I01.[SPGI01_SUB_BUSINESS_TYPE_C] = 'PRD'  
      and I01.[SPGI01_CREATE_S] between '10-08-2012 00:00:00.000' AND '11-18-2012 23:59:59.000'  
  ) x 
  pivot 
  ( 
    count(WeekEnd) 
    FOR weekno IN ([34], [35], [36], [37], [38], [39])  
  ) p 
) x1 
GROUP BY  InstanceType WITH ROLLUP

阅读 248

收藏
2021-04-15

共1个答案

小编典典

如果您希望能够传递任何日期值来获取符合您条件的数据,那么对于这种类型的用户,PIVOT您将需要使用类似于以下内容的动态SQL解决方案:

DECLARE @cols AS NVARCHAR(MAX),
    @colsRollup AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @StartDate DateTime,
    @EndDate DateTime

Set @StartDate = '10-08-2012 00:00:00.000'
Set @EndDate = '11-18-2012 23:59:59.000'

select @cols = STUFF((SELECT ',' + QUOTENAME(WeekEnd) 
                    from
                    (
                      select DatePart(wk, I01.[SPGI01_CREATE_S]) WeekEnd
                      from [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY]
                      where I01.[SPGI01_CREATE_S] between @StartDate AND @EndDate
                    ) src
                    group by WeekEnd
                    order by WeekEnd desc
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsRollup = STUFF((SELECT ', Sum(' + QUOTENAME(WeekEnd) +') as WeekNo'+Cast(Weekend as varchar(2))
                    from
                    (
                      select DatePart(wk, I01.[SPGI01_CREATE_S]) WeekEnd
                      from [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY]
                      where I01.[SPGI01_CREATE_S] between @StartDate AND @EndDate
                    ) src
                    group by WeekEnd
                    order by WeekEnd desc
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = '
             SELECT case when InstanceType is not null then InstanceType else ''Sum'' End InstanceType ,  
                '+@colsRollup+',  max(InstanceDescription) AS InstanceDescription
             FROM
             (
               SELECT SPGI01_INSTANCE_TYPE_C as InstanceType,
                    InstanceDescription, ' + @cols + ' 
               from 
               (
                  SELECT I01.[SPGI01_INSTANCE_TYPE_C], 
                    DatePart(wk, I01.[SPGI01_CREATE_S]) WeekNo, 
                    DATEADD(DAY, 7 -DATEPART(WEEKDAY,I01.[SPGI01_CREATE_S]),  I01.[SPGI01_CREATE_S]) WeekEnd, 
                    J03.SPGJ03_MSG_TRANSLN_X InstanceDescription  
                  FROM [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY] I01  
                  INNER JOIN [SUPER-G].[dbo].[CSPGI50_VALID_INSTANCE_TYPE] I50 
                    ON I50.[SPGI50_INSTANCE_TYPE_C] = I01.[SPGI01_INSTANCE_TYPE_C]  
                  LEFT JOIN CSPGJ02_MSG_OBJ J02 
                    ON I50.SPGJ02_MSG_K = J02.SPGJ02_MSG_K  
                  LEFT JOIN CSPGJ03_MSG_TRANSLN J03 
                    ON J02.SPGJ02_MSG_K = J03.SPGJ02_MSG_K  
                  where I50.[SPGA04_RATING_ELEMENT_D] = 1  
                    and I01.[SPGI01_EXCEPTIONED_F] = ''N'' 
                    and I01.[SPGI01_DISPUTED_F] != ''Y''  
                    AND J03.[SPGJ03_LOCALE_C] =  ''en_US''  
                    and I01.[SPGA02_BUSINESS_TYPE_C] = ''PROD'' 
                    and I01.[SPGA03_REGION_C] = ''EU''  
                    and I01.[SPGI01_SUB_BUSINESS_TYPE_C] = ''PRD''
                    and I01.[SPGI01_CREATE_S] between '+ convert(varchar(10), @StartDate, 120)+' AND '+ convert(varchar(10), @EndDate, 120)+'
              ) x
              pivot 
              (
                  count(WeekEnd)
                  for weekno in (' + @cols + ')
              ) p 
             ) x1
             GROUP BY InstanceType WITH ROLLUP '

execute(@query)

注意:这是未经测试的,因为我没有任何示例数据,等等。

2021-04-15