2016-08-23 18 views
3

私は計算したいどのような以下のリーステーブルsqlを使用して投影合計を計算するにはどうすればよいですか?

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.. 

単一のクエリで効率的にこれを行う方法はありますか?

このような何かが、仕事ができる

答えて

1
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; 

月のリストを生成する方法はたくさんあります。ここでは1だ:

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

+0

これは完璧に機能しています。データベースのカレンダーテーブルの中で、それはすばやく効率的です。ありがとうございます。私は先進的なSQL(私のために高度な)を学ぶことができる場所に関する提案はありますか? –

+0

@MadhuraKshirsagar私はあなたに単一のチュートリアル/お勧めの良い人がいるか分かりません。どのくらいのことを理解していますか? – shawnt00

1

:それをする

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 
+0

をよくやったが、それは括弧だけMSSQLで動作することを指摘しておきます。 Madhuraが何か他のものを使用している場合は、それらを削除する必要があります。 – Jacobm001

+0

残念ながら、あなたの結果は累積合計を与えています。偶然にも、最初の3ヶ月間の「働き」/リースですが、それは本当に質問に関するものではありません:(基本的にはリースの最初の月を見ているだけです) – shawnt00

関連する問題