【问题标题】:How to get the six week sunday count using the Weekno in SQL Server 2008? [duplicate]如何使用 SQL Server 2008 中的 Weekno 获得六个星期的星期日计数? [复制]
【发布时间】:2012-11-29 10:11:28
【问题描述】:

可能重复:
How to group by the each week upto last six week sundays dates in sql?

我需要计算周数。它工作正常,但我不知道是 [34]、[35]、[36]、[37]、[38]、[39] 的星期几。 weekno 仅在运行时知道。例如,一年中它总共包含 52 周。我在@Bluefeet 的帮助下得到了这个查询,他在同一个stackoverflow 上发布了这个查询。如果我在 between 字段中更改起始日期和截止日期,它将不起作用。因为我在下面的查询中硬编码了 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 

【问题讨论】:

  • 你在运行时使用什么编程语言?

标签: sql sql-server sql-server-2008


【解决方案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)

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

【讨论】:

  • 我要问的是,您发布了查询@cols、@colsRollup、@query 然后执行(@query)。我可以一个一个地运行或复制整个查询然后运行。 @...是什么意思,它像对象一样存储吗?
  • @AdalarasanSachithanantham 这些是变量,您需要整个过程才能成功运行查询
  • 我在哪里可以在上面的查询中给出开始日期和结束日期?
  • 专栏正在增长...但它没有显示答案
  • @AdalarasanSachithanantham 您可能会惊讶地发现,本网站上的每个人都自愿贡献自己的时间,而他们的努力并没有得到任何补偿。要求别人抽出时间来帮助你是没有效率的,并且会被一些人(大多数人)认为是非常粗鲁的。
猜你喜欢
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 2017-09-14
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多