SQLServer2005中几个星期的分区

SQLServer2005中几个星期的分区,sql,sql-server-2005,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 响应应类似于smth: wk:7,8,9,10,11,12,13,14,15,16,17,18,19 numx:3,5,6,10,12,12,12,

表中有两列日期。一个日期表示预期日期,另一个日期表示作业完成时的日期。我想查询一下今年有多少工作完成了,包括具体的一周,以及到那一周应该完成多少工作

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

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 
响应应类似于smth:

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
我使用的是SQLServer2005,甚至不知道如何像示例中那样在一个列中获得不同的周数


关于

最简单的方法可能是使用适当的数字源生成周间隔,然后基于周数进行条件聚合。系统表master..spt_值有一列可用于周数,预期和完成日期的周数可使用datepartwk提取,但这可能会产生一些奇怪的结果,因此我建议使用中的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)) 
产出将是:

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