如果我有一个记录表和活动/不活动日期,是否有一种简单的方法可以按月计算活动记录?例如:
tbl_a
id dt_active dt_inactive
a 2013-01-01 2013-08-24
b 2013-01-01 2013-07-05
c 2012-02-01 2012-01-01
如果我必须按月生成活动记录的输出,如下所示: active:dt_active< first_day_of_month< = dt_inactive
month count
2013-01 2
2013-02 2
2013-03 2
2013-04 2
2013-05 2
2013-06 2
2013-07 2
2013-08 1
2013-09 0
除了上传日期临时表和使用子查询之外,还有什么聪明的方法吗?
答案 0 :(得分:1)
这是一种在月初提供活动计数的方法。它会创建所有月份的列表,然后将此信息加入tbl_a
。
with dates as (
select cast('2013-01-01' as date) as month
union all
select dateadd(month, 1, dates.month)
from dates
where month < cast('2013-09-01' as date)
)
select convert(varchar(7), month, 121), count(a.id)
from dates m left outer join
tbl_a a
on m.month between a.dt_active and a.dt_inactive
group by convert(varchar(7), month, 121)
order by 1;
注意:如果dt_inactive
是第一个不活动日期,那么on
子句应为:
on m.month >= a.dt_active and m.month < a.dt_inactive
Here是一个带有工作查询的SQL小提琴。