用于计算范围内每天的SQL代码

时间:2013-09-19 21:01:40

标签: sql sql-server count

我有一个data.frame,如下所示。

toolid          startdate       enddate         stage
abc                 1-Jan-13    5-Jan-13    production
abc                 6-Jan-13    10-Jan-13   down
xyz                 3-Jan-13    8-Jan-13    production
xyz                 9-Jan-13    15-Jan-13   down

我想获得最终输出,如下所示。输出需要返回 - 每个阶段的计数(可能超过2个阶段)在1jan13到15jan13(或用户想要的任何日期范围)之间的每一天。我能够在R中创建所需的结果。我还在SQL中编写了一个游标,它实现了目的。但有没有办法在不使用游标的情况下做同样的事情?我正在寻找逻辑和方向。

         date down production
1  2013-01-01    0          1
2  2013-01-02    0          1
3  2013-01-03    0          2
4  2013-01-04    0          2
5  2013-01-05    0          2
6  2013-01-06    1          1
7  2013-01-07    1          1
8  2013-01-08    1          1
9  2013-01-09    2          0
10 2013-01-10    2          0
11 2013-01-11    1          0
12 2013-01-12    1          0
13 2013-01-13    1          0
14 2013-01-14    1          0
15 2013-01-15    1          0

1 个答案:

答案 0 :(得分:3)

我认为这可能是你想要的。它需要一个递归CTE来获取该范围内每一天的行。

with daterange as (
    select startdate=min(startdate),enddate=max(enddate) from #source
), dates as (
    select d=(select startdate from daterange) union all
    select dateadd(day,1,d) from dates where d<(select enddate from daterange)
)
select 
    d,
    down=(select count(*) from #source where d between startdate and enddate and stage='down'),
    production=(select count(*) from #source where d between startdate and enddate and stage='production')
from dates
order by d;