【问题标题】:How to group by the each week upto last six week sundays dates in sql?如何在sql中按每周到最后六个星期的星期日日期分组?
【发布时间】:2012-09-26 11:15:40
【问题描述】:

目前正在编写报告。我需要的是 样本表,

Instance Type   Sep-23  Sep-16  Sep-09  Sep-02  Aug-26  Aug-19
-------------------------------------------------------------------------
Early ASN        4        2      4        1       1       2
Late ASN         2        1      5        3       1       1
     Sum         6        3      9        4       2       3

但实际表是,

SPGI01_INSTANCE_TYPE_C  SPGI01_CREATE_S
--------------------------------------------------------------
Early ASN                9/17/2012 12:00:00.000
Early ASN           9/18/2012 10:06:11.000
Early ASN           9/19/2012 8:00:04.000
Early ASN           9/20/2012 3:00:05.000
Early ASN           9/10/2012 12:00:07.000
Early ASN           9/11/2012 12:00:32.000
Early ASN           9/3/2012 12:00:17.000
Early ASN           9/4/2012 10:06:00.000
Early ASN           9/5/2012 8:00:00.000
Early ASN           9/6/2012 3:00:00.000
Early ASN           8/31/2012 12:00:00.000
Early ASN           8/26/2012 12:00:00.000
Early ASN           8/14/2012 12:00:00.000
Early ASN           8/15/2012 12:00:00.000
Late ASN            9/17/2012 12:00:00.000
Late ASN            9/18/2012 10:06:00.000
Late ASN            9/11/2012 12:00:00.000
Late ASN            9/3/2012 12:00:00.000
Late ASN            9/4/2012 10:06:00.000
Late ASN            9/5/2012 8:00:00.000
Late ASN            9/6/2012 3:00:00.000
Late ASN            9/6/2012 2:00:00.000
Late ASN            8/31/2012 12:00:00.000
Late ASN            8/31/2012 12:00:00.000
Late ASN            8/31/2012 12:00:00.000
Early ASN           8/15/2012 12:00:00.000

我需要按“SPGI01_INSTANCE_TYPE_C”列分组,并将每个星期的星期日分组到最后六个星期的星期日。在这里我粘贴了两个示例表,一个表是我想要的,另一个表是我拥有的。给我解决方案。

我的查询是,

SELECT distinct I01.[SPGI01_INSTANCE_TYPE_C],
count (I01.[SPGI01_INSTANCE_TYPE_C])
  FROM [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY] I01,
  [SUPER-G].[dbo].[CSPGI50_VALID_INSTANCE_TYPE] I50

where
I01.[SPGA02_BUSINESS_TYPE_C] = 'prod'
and
I01.[SPGA03_REGION_C] in( 'ap','na','sa','eu')
and 
I01.[SPGI01_SUB_BUSINESS_TYPE_C] = 'PRD'
and
(I01.[SPGI01_CREATE_S] between '2012-01-01 12:00:00.000' AND DATEADD(day , 7, '2012-01-15 00:00:00.000'))

and
I01.[SPGI01_EXCEPTIONED_F] = 'N'
and
I01.[SPGI01_DISPUTED_F] != 'Y'
and
I50.[SPGI50_INSTANCE_TYPE_C] = I01.[SPGI01_INSTANCE_TYPE_C]
and 
I50.[SPGA04_RATING_ELEMENT_D] = 1
group by I01.[SPGI01_INSTANCE_TYPE_C]

【问题讨论】:

  • 如前所述,添加一些有效的查询,不要紧,它是错误的,是一个起点,也许你离正确的不远。
  • 您要求GROUP BY 周日,但您发布的日期是周五,您想要的正确日期是?

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


【解决方案1】:

我对您发布的数据做了一些假设。

首先,您发布的值都将年份声明为2011,但作为列标题的最终结束日期与2011 不对应,它们是2012Sunday 值,所以我更改了数据。也是Early ASN 8/15/2011 12:00 的最终条目,我相信应该是Late ASN 条目,否则总数匹配。

要获得结果,您需要应用PIVOT 函数。此函数允许您聚合值,然后将它们转换为列。

SET DATEFIRST 1 -- set this so the start of the week is Sunday
select InstanceType,
  sum([39]) as Sep_23, 
  sum([38]) as Sep_16, 
  sum([37]) as Sep_09, 
  sum([36]) as Sep_02, 
  sum([35]) as Aug_26, 
  sum([34]) as Aug_19
from
(
  select SPGI01_INSTANCE_TYPE_C as InstanceType,
    [39], [38], [37], [36], [35], [34]
  from
  (
    select SPGI01_INSTANCE_TYPE_C,
      DatePart(wk, SPGI01_CREATE_S) WeekNo,
      DATEADD(DAY, 7 -DATEPART(WEEKDAY,SPGI01_CREATE_S),SPGI01_CREATE_S) WeekEnd
    from table1
  ) x
  pivot
  (
    count(WeekEnd)
    for weekno in ([39], [38], [37], [36], [35], [34])
  ) p
) x1
group by InstanceType with rollup

SQL Fiddle with Demo

【讨论】:

  • 嗨,bluefeet,我已经添加了我的查询。我需要加入两个表并获取这些值。我希望在这里很容易理解。
  • @ThinkWhoiam 那么您应该使用两个表中的工作数据创建一个SQL Fiddle
  • @ThinkWhoiam 很高兴你知道了。 :)
  • 我对查询还有另一个问题。我想要最后六个星期的星期日日期,不包括当前星期,例如系统日期是 Oct-05-2012。此时我需要 sep-23、sep-16、sep-9、sep-2、aug-26、aug -9。同样的查询返回我想要的吗?
  • @ThinkWhoiam 您只需使用WHERE 子句过滤数据,然后调整 weeknumber 值。
猜你喜欢
  • 2019-04-08
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多