1

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

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

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

有什么优雅的方法可以做到这一点吗?我知道我必须考虑年份。

4

1 回答 1

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)在查询结束时。

于 2012-04-04T08:22:42.253 回答