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-2020
到 12-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 做几乎相同的事情。
我有一个 table ClientProfile
,其中包含一个名为 StartDate
的列,该列的数据类型为 date
,第二列名为 MonthlyRevenue
这是 numeric(18,2)
中的金额列,第三列称为 ContractMonths
数据类型 int
,它指定项目将处于活动状态的月数。用户需要 select 一个日期范围,查询应该能够获取完整的日期范围(按月)指定每个月的金额。
例如:
项目 A 将从 2020-03-01
(1st March
) 开始,合同将 运行 持续 6 个月,因此当用户 select 的日期 02-2020
到 12-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 做几乎相同的事情。