使用SQL的具有开始和结束日期的对象的每月计数

时间:2012-04-04 08:03:48

标签: tsql count

我想创建一个条形图,显示每月基础上可用的对象数量。所有行都有一个开始和结束日期。我知道如何计算一个月的计数:

SELECT COUNT(*) As NumberOfItems
FROM Items
WHERE DATEPART(MONTH, Items.StartDate) <= @monthNumber 
AND DATEPART(MONTH, Items.EndDate) >= @monthNumber

现在我想创建SQL以使用单个SELECT语句获取月份编号和项目数。

有没有优雅的方法来实现这个目标?我知道我必须考虑年份数。

1 个答案:

答案 0 :(得分:3)

假设Sql Server 2005或更新版本。

CTE部分将返回跨越@startDate和@endDate之间年份的月份数。主体将月份数字与在Items.StartDate和Items.EndDate上执行相同转换的项目连接。

; with months (month) as (
  select datediff (m, 0, @startDate)
  union all
  select month + 1
    from months
  where month < datediff (m, 0, @endDate)
)
select year (Items.StartDate) Year,
       month (Items.StartDate) Month,
       count (*) NumberOfItems
  from months
  inner join Items
     on datediff (m, 0, Items.StartDate) <= months.month
    and datediff (m, 0, Items.EndDate) >= months.month
  group by 
       year (Items.StartDate),
       month (Items.StartDate)

注意:如果您打算超过一百个月,则在查询结束时需要option (maxrecursion 0)