我有一个表,其中包括有效期和失效期。鉴于日期范围,我需要计算该日期范围内每个月的活跃数量。任何想法如何做到这一点?
编辑: 似乎许多人都忽略了问题的重点。查询不是一个简单的地方。我的记录具有不同的有效期和到期日。我想运行一个查询,给定日期范围,它返回给定范围内每个月的计数,记录数。因此,如果我在2012年8月至2013年8月期间给出日期范围,则需要每个月给我一次,根据其有效期和有效期记录活动。
数据的一个例子
EffDt ExpDt Id
08/01/2012 10/01/2012 1
08/01/2012 09/31/2012 2
10/01/2012 01/01/2013 3
11/01/2012 08/01/2013 4
01/01/2013 09/01/2013 5
if the date range is 07/01/2012 - 05/01/2013 I should get
Date Count
07-2012 0 - there are no active records in 07-2012
08-2012 2 - id 1 and 2 are active in 08-2012
09-2012 2 - id 1,2 are active in 09-2012
10-2012 2 - id 1,3 are active but 2 is no longer active in 10-2012
11-2012 3 - id 1,3,4 are now active, 2 is not longer active
12-2012 3
01-2013 4
02-2013 3 - id 3 is now no longer active
03-2013 3
04-2013 3
05-2013 3
答案 0 :(得分:3)
获得此结果的最简单方法是创建包含日期的日历表,然后您可以将日历表加入当前表以确定日期范围内的内容。
如果您没有日历表,则可以使用递归CTE生成日期列表:
;with cte (dt) as
(
select cast('2012-07-01' as date)
union all
select dateadd(m, 1, dt)
from cte
where dateadd(m, 1, dt) <= '2013-05-01'
)
select dt
from cte
您可以使用此CTE连接到您的表并获取范围中每行的计数:
;with cte (dt) as
(
select cast('2012-07-01' as date)
union all
select dateadd(m, 1, dt)
from cte
where dateadd(m, 1, dt) <= '2013-05-01'
)
select c.dt, count(t.id) TotalCount
from cte c
left join yourtable t
on c.dt >= t.effdt
and c.dt <= t.expdt
group by c.dt