我有一个帮助台系统,其中有一张带有故障单详细信息的表格。我在SQL服务器中有一个表,其数据类似于此,
ID status create_date closing_date
---------------------------------------------------------
1 closed 2015-01-01 14:06:30 2015-01-02 18:06:42
2 closed 2015-01-01 15:16:42 2015-01-02 08:12:10
- - - -
- - - -
现在我想显示过去5个星期过去2个月关闭门票所需的小时数。
例如,我想显示从今天开始的过去5周内的数据(49,50,51,52,1),每周应查看过去2个月的关闭门票。 (第49周,数据应在第49周至第60天和第49周结束日期之间)。
目前,我已经使用循环来获得这样的结果,
declare @week_start datetime, @week_end datetime, @week int, @last_week int, @week_number int
set @last_week = datepart(wk, dateadd(wk, -1, getdate()))
set @week_number = dbo.F_ISO_WEEK_OF_YEAR(dateadd(wk, -5, getdate()))
set @week = @last_week - 4
set @week_start = dateadd(day, -60, dateadd(wk, -5, DATEADD(week, DATEDIFF(day, 0, getdate())/7, 4)))
set @week_end = dateadd(wk, -5, DATEADD(week, DATEDIFF(day, 0, getdate())/7, 4))
while @week <= @last_week
begin
select @week_number as week_number,
cast(avg(cast(Datediff(hour,create_date,closing_date) as decimal (10,2))) as decimal(10,2)) Hours
FROM tickets
where closing_date between @week_start
and @week_end
--group by dbo.F_ISO_WEEK_OF_YEAR(closing_date )
set @week_start = dateadd(wk, 1, @week_start)
set @week_end = dateadd(wk, 1, @week_end)
set @week = @week + 1
set @week_number = @week_number + 1
end
返回以下数据
week_number Hours
--------------------
49 121.56
50 129.06
51 125.57
52 125.90
53 130.52
现在,我不想使用循环,因为它会弄乱周数,我也想显示ISO周数。
所以这是我修改过的代码,
select dbo.F_ISO_WEEK_OF_YEAR(closing_date) as week_number,
cast(avg(cast(Datediff(hour,create_date,closing_date) as decimal (10,2))) as decimal(10,2)) Hours
FROM tickets
where closing_datebetween DATEADD(wk, -5, getdate()) and DATEADD(wk, -1, getdate())
group by dbo.F_ISO_WEEK_OF_YEAR(closing_date)
但它会返回以下数据,这些数据不正确,因为它没有查看特定周的过去2个月,
week_number Hours
--------------------
49 142.69
50 262.76
51 95.50
52 85.39
1 75.90
我不知道如何在不使用循环的情况下修改查询以获得相同的结果。
任何帮助将不胜感激。
感谢。
答案 0 :(得分:0)
在没有看到你的基础数据的情况下获得完整的上下文有点困难,但我的第一个猜测是你的迭代代码,你有一个滑动窗口(即5周前你看过去2个月+ 5周,4周前,过去2个月+4等)。您的select语句静态查看某个时间点的值。
如果您运行的是SQL Server 2012+,则可以使用行框来定义这样的滑动窗口(http://msdn.microsoft.com/en-us/library/ms189461.aspx)。或者,我谨慎地说,如果你只需要返回5行,那么在同一个表中点击5次这样的报告并不是那么糟糕。如果您可以提供示例数据,则可以获得更多特定于代码的回复。