我有一张用户表。每个用户都有一个SubscriptionStartDate和一个SubscriptionEndDate
如果他们的订阅尚未安排结束,则结束日期可以为空
我需要在一段时间内按月计算有效订阅的数量
我可以一次这样做一个月,但我希望一个查询可以一次性给我所有结果,比如每年一个月或更长时间。
declare @startDate datetime;
declare @endDate datetime;
set @startDate = '2-01-2016';
set @endDate = '2-29-2016'
select COUNT(*)
from Users
where SubscriptionStartDate <= @startDate
and (SubscriptionEndDate is null or SubscriptionEndDate>= @endDate)
如何编写查询或CTE来执行此操作?
答案 0 :(得分:1)
使用时间表或CTE并使用APPLY,您可以这样尝试。
with months AS (
select CONVERT(DATE,'2015-01-01') MonthStart, CONVERT(DATE,'2015-01-31') MonthEnd
union all
select dateadd(MONTH,1,MonthStart), dateadd(DAY,-1,dateadd(MONTH,2,MonthStart))
from months
where
dateadd(MONTH,1,MonthStart) < GETDATE()
)
select
*
from months m
outer apply (
select
COUNT(*) UserCount
from [Users] [U]
where
SubscriptionStartDate <= m.MonthEnd and
(ISNULL(SubscriptionEndDate,'3000-01-01')>= m.MonthStart)
) Users
OPTION (MAXRECURSION 0)
答案 1 :(得分:0)
从您要检查的范围内的所有月份的表格或CTE开始,并使用用户表格中的订阅日期加入该表格。