我想创建一个条形图,显示每月基础上可用的对象数量。所有行都有一个开始和结束日期。我知道如何计算一个月的计数:
SELECT COUNT(*) As NumberOfItems
FROM Items
WHERE DATEPART(MONTH, Items.StartDate) <= @monthNumber
AND DATEPART(MONTH, Items.EndDate) >= @monthNumber
现在我想创建SQL以使用单个SELECT语句获取月份编号和项目数。
有没有优雅的方法来实现这个目标?我知道我必须考虑年份数。
答案 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)
。