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

Posted

技术标签:

【中文标题】SQL中项目收入的日期范围计算?【英文标题】:Date range calculation for a project revenue in SQL? 【发布时间】:2020-05-12 01:27:05 【问题描述】:

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

例如: 项目 A 将从 2020-03-01 (1st March) 开始,合约将运行 6 个月,因此当用户选择日期 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

我非常感谢任何帮助,因为我被困在这一点上并且无法弄清楚这一点。

【问题讨论】:

请告诉我们你到目前为止做了什么?因为“我被困在这一点上,无法弄清楚这一点”。干杯! 【参考方案1】:

一种方法是递归 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)

或者,您可以在您的应用程序中构建一个月历表,然后直接使用该表执行几乎相同的操作。

【讨论】:

谢谢 Gordon,这正是我一直在寻找的东西,它奏效了。

以上是关于SQL中项目收入的日期范围计算?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 计算项目状态历史记录在日期范围内的项目项

计算按国家和日期细分的每个项目的总收入

sql 返回日期范围内订单的收入,转换,非眩光和抛光状态

如何在 SQL 中计算每个用户的唯一日期的平均收入

Oracle SQL 多列与单个范围/图例对齐

SQL从日期范围内的同一表中的不同记录中获取多个项目的总和(ORACLE)