我如何使用 sql 计算投影总和?

How do i calculate a projection sum using sql?

我有以下租约table

Lease_id Apt_id Resident_id Start_Date End_Date   Upfront_Amt Monthly_Fee
101      110    1001        02/01/2015 07/31/2015 250          500
102      111    1002        03/01/2015 02/29/2016 1000         2000
103      112    1003        04/01/2015 03/31/2016 750          1500

我想计算的是月费收入的预测。 例如:

01/2015 0 (No lease active)
02/2015 500 (From Lease 101)
03/2015 500 + 2000 (From Lease 101 and 102)
04/2015 500 + 2000 + 1500 (From Lease 101, 102 and 103)
:
:
08/2015 2000 + 1500 (From lease 102 and 103)
etc..

有没有一种方法可以通过单个查询高效地执行此操作?

类似这样的方法可行:

SELECT l1.[Start_Date], SUM(l2.SumFee)
FROM Lease as l1, (SELECT [Start_Date],SUM(Monthly_Fee) As SumFee
FROM Lease
GROUP BY [Start_Date]) as l2
WHERE l1.[Start_date]>=l2.[Start_Date]
GROUP BY l1.[Start_Date]

另一种方法是:

SELETC l1.Start_Date, l1.Monthly_Fee, SUM(l2.Fee) as CumulativeSum
FROM Lease as l1
INNER JOIN Lease as l2 ON l1.Start_Date >= l2.Start_Date
GROUP BY l1.Start_Date, l1.Monthly_Fee
ORDER BY l1.Start_Date
select
    format(m.Lease_Month, 'MMM yyyy') as Lease_Month,
    sum(sum(Monthly_Fee)) over (partition by m.Lease_Month) as Projection
from
    <list of months> m left outer join
    Lease l
        on m.Lease_Month between l.Start_Date and l.End_Date
group by
    m.Lease_Month
order by
    m.Lease_Month;

有很多方法可以生成月份列表。这是一个:

declare @num_Months int = 16;
declare @start_Date date = '20150101';

with months as (
    select @start_Date as Lease_Month, 1 as Month_Num
    union all
    select dateadd(month, Month_Num, @start_Date), Month_Num + 1
    from months
    where Month_Num < @num_Months
) ...

将它们放在一起并在此处查看运行:http://rextester.com/YUAF69376