在SQL Server 2005中分区数周

时间:2015-03-19 13:06:05

标签: sql sql-server-2005

我在表格中有两列日期。一个日期代表预期日期,另一个日期代表作业完成。我想查询以获得完成的工作数量,包括当前年份的特定工作周数以及应该完成的工作周数。

因此,如果我将这两个列中的日期转换为几周:

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,甚至不知道如何在一个列中获得不同的周,如示例所示。

此致

1 个答案:

答案 0 :(得分:0)

最简单的方法(?)可能是使用适当的数字来源生成周数间隔,然后根据周数进行条件聚合。系统表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)) 

给出一个输入表,如:

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