2013-04-20 131 views
0

請有人給我一些指針。付款分析 - SQL服務器查詢

我們需要發出一個法定欠款通知。

用於發送出來的標準是當一個帳戶已經錯過了2個全付款或等效。也就是說,如果他們每月支付100英鎊,但在4個月內只支付50英鎊,則他們應該得到通知。

我已經退出其分離出還款計劃到日期範圍查詢,每個範圍之間我已經總結了該期間內支付的款項。對於每個結果,我還計算了DueToDate和PaidToDate。

我有工作了某種形式的評分系統的每一行,然後在查詢結束的問題,總結出給其確定該通知是由於與否的全部得分。

結果結構是這樣的。

DueDate | DateFrom | DateTo | AmountDue | AmountPaid | DueToDate | PaidToDate 
+0

哪個版本的SQL Server 2012的? – RichardTheKiwi 2013-04-20 11:46:44

+0

嗨。謝謝 – 2013-04-20 14:42:02

回答

1

如果你的意思是你已經有一個產生設置像下面

DueDate | DateFrom | DateTo | AmountDue | AmountPaid | DueToDate | PaidToDate 
20120301 | 20120201 | 20120229 | 100.00 | 50.00 | 100.00 | 50.00 
20120401 | 20120301 | 20120331 | 100.00 | 50.00 | 200.00 | 100.00 
20120501 | 20120401 | 20120430 | 100.00 | 50.00 | 300.00 | 150.00 
20120601 | 20120501 | 20120531 | 100.00 | 50.00 | 400.00 | 200.00 

結果的查詢,然後這裏有前視每月AmountDue是否是恆定的兩種方式。如果是,那麼你可以使用

select * 
from QueryResult 
where DueToDate - PaidToDate >= 2 * AmountPaid; 

如果不是恆定的,那麼你可以使用SQL Server 2012 LAG()從現有行添加AmountPaid到當前

;WITH Lagged AS (
    select *, PriorAmount = LAG(AmountPaid, 1, 0) OVER (order by DueDate) 
    from QueryResult 
) 
select * 
from Lagged 
where DueToDate - PaidToDate >= AmountPaid + PriorAmount; 

或者只需在原始查詢的另一列中保留一個正在運行的總數,例如

DueDate | DateFrom | DateTo | AmountDue | AmountPaid | DueToDate | PaidToDate | TwoPeriods 
20120301 | 20120201 | 20120229 | 100.00 | 50.00 | 100.00 | 50.00 | 100.00 
20120401 | 20120301 | 20120331 | 100.00 | 50.00 | 200.00 | 100.00 | 200.00 
20120501 | 20120401 | 20120430 | 100.00 | 50.00 | 300.00 | 150.00 | 200.00 
20120601 | 20120501 | 20120531 | 100.00 | 50.00 | 400.00 | 200.00 | 200.00 
+0

嗨。我已嘗試從QueryResult 的代碼中選擇* ,其中DueToDate - PaidToDate> = 2 * AmountPaid;但這似乎只能收回兩筆明確的錯過付款,而不是累計錯過的款項。 – 2013-04-20 18:19:45