指定时间段内程序中的SQL循环人数

时间:2018-06-27 19:02:20

标签: sql sql-server tsql

我不确定是否应该对此进行循环,或者最简单的方法是什么。

我的数据包括参与我们计划的人员列表。它们具有不同的开始日期和结束日期,但是以下等式能够捕获特定日期的参加人数:

DECLARE @PopulationDate DATETIME = '2018-06-01 05:00:00';
select count(People) 
FROM Program_Log
WHERE 
START_TIME <= @PopulationDate
AND (END_TIME >= @PopulationDate OR END_TIME IS NULL)`

有没有一种方法可以循环使用不同的日期值来获取整年中每天的计划参与者人数? 多年?

1 个答案:

答案 0 :(得分:1)

一种简单的方法是使用CTE生成日期,然后使用left join引入数据。例如,以下内容获取了今年这一月的第一天的计数:

with dates as (
      select cast('2018-01-01' as date) as dte
      union all
      select dateadd(month, 1, dte)
      from dates
      where dte < getdate()
     )
select d.dte, count(pl.people)
from dates d left join
     program_log pl
     on pl.start_time <= d.dte and (pl.end_time >= d.dte or pl.end_time is null)
group by d.dte
order by d.dte;

请注意,这对于少数几个日期来说效果最佳。如果要大于100,则需要在查询的末尾添加option (maxrecursion 0)

此外,count(people)高度可疑。也许您是说sum(people)或类似的意思。