SQL 中项目收入的日期范围计算?

Date range calculation for a project revenue in SQL?

我有一个 table ClientProfile,其中包含一个名为 StartDate 的列,该列的数据类型为 date,第二列名为 MonthlyRevenue 这是 numeric(18,2) 中的金额列,第三列称为 ContractMonths 数据类型 int,它指定项目将处于活动状态的月数。用户需要 select 一个日期范围,查询应该能够获取完整的日期范围(按月)指定每个月的金额。

例如:
项目 A 将从 2020-03-01 (1st March) 开始,合同将 运行 持续 6 个月,因此当用户 select 的日期 02-202012-2020.

我应该能得到这样的结果:

Month     Revenue
-----------------   
02-2020   0
03-2020   100
04-2020   100
05-2020   100
06-2020   100
07-2020   100
08-2020   100
09-2020   0
10-2020   0
11-2020   0
12-2020   0

我真的很感激任何帮助,因为我被困在这一点上,无法解决这个问题。

一种方法是递归 CTE 来生成月份:

with months as (
      select @startmonth as mon
      union all
      select dateadd(month, 1, mon)
      from months
      where mon < @endmonth
     )
select months.mon, coalesce(cp.monthlyrevenue, 0) as revenue
from months left join
     clientprofile cp
     on cp.project = @project and
        cp.startdate <= months.mon and
        dateadd(month, cp.contractmonths, cp.startdate) >= months.mon;

如果期限可以超过100个月,需要加上option (maxrecursion 0)

或者,您可以在您的应用程序中构建月历 table,然后直接使用该 table 做几乎相同的事情。