在 SQL Server 2005 中分区数周

Partition over weeks in SQL Server 2005

我在 table 中有两列日期。一个日期代表预期日期,另一个代表工作完成的日期。我想查询以获取完成了多少工作,包括当年的特定一周以及该周应该完成多少工作。

因此,如果我将这两个列中的日期(以周为单位)转换为:

wkx:7,7,7,8,8,9,10,10,10,10,11,11
wkf:7,8,10,10,12,13,14,15,16,17,18,19 

响应应该是这样的:

wk:7,8,9,10,11,12,13,14,15,16,17,18,19
numx:3,5,6,10,12,12,12,12,12,12,12,12,12
numf:1,2,2,4,4,5,6,7,8,9,10,11,12

我正在使用 SQL Server 2005,甚至不知道如何在一个列中获得不同的星期,就像示例中那样。

此致

最简单的方法 (?) 可能是使用适当的数字源来生成周间隔,然后根据周数进行条件聚合。系统 table master..spt_values 有一列可用于周数,expectedfinished 日期的周数可以使用 datepart(wk, expected) 提取但这会产生一些奇怪的结果,所以我建议使用 this excellent answer.

中的 dbo.f_isoweek() 函数

函数:

CREATE function f_isoweek(@date datetime)
RETURNS INT
AS
BEGIN
  RETURN (datepart(DY, datediff(d, 0, @date) / 7 * 7 + 3)+6) / 7
END

查询将如下所示:

select 
    week = number,     
    numx = sum(case when dbo.f_isoweek(expected) = number then 1 else 0 end),
    numf = sum(case when dbo.f_isoweek(finished) = number then 1 else 0 end),   
from master..spt_values, your_table 
where type='p' -- the type for the numbers in spt_values
  -- limit to current year
  and datepart(year, expected) = datepart(year, getdate()) 
  and datepart(year, finished) = datepart(year, getdate())
group by number 
-- limit weeks to available range (could be replaced with number between 1 and 53)
having number >= dbo.f_isoweek(min(expected)) and number <= dbo.f_isoweek(max(finished)) 

给定输入 table 例如:

expected    finished
2015-01-05  2015-01-16
2015-01-06  2015-01-07
2015-01-18  2015-01-20
2015-01-25  2015-01-26
2015-01-26  2015-01-27
2015-02-08  2015-02-10
2015-02-10  2015-02-16

输出将是:

week    numx    numf
2       2       1
3       1       1
4       1       1
5       1       2
6       1       0
7       1       1
8       0       1