2012-07-12 63 views
2

我需要在客戶級別創建貸方餘額的老化報告。SQL:根據財務報告的上一個付款日期創建老化桶

注:

  1. 老化根據客戶的最後付款日期。

  2. 客戶可以擁有多個帳戶,並且有時會向錯誤帳戶應用付款時發生錯誤。例如,一個帳戶餘額爲15美元的客戶可以支付15美元的費用。 15美元的付款可能適用於錯誤的賬戶,客戶的賬戶餘額爲15美元,另一賬戶餘額爲15美元。該客戶需要被排除在報告之外。

的SQL來獲取客戶的信貸餘額:

SELECT 
    ACCOUNT.CUST_ID 
, sum(ACCOUNT.BALANCE) 

FROM ACCOUNT 

GROUP BY ACCOUNT.CUST_ID 

HAVING sum(ACCOUNT.BALANCE) < 0 

SQL以獲得最新的付款日期:

SELECT 

    TRANSACTIONS.CUST_ID 
, MAX(TRANSACTIONS.POST_DATE) 

FROM TRANSACTIONS 

WHERE TRANSACTIONS.TX_TYPE = 'PAYMENT' 

GROUP BY TRANSACTIONS.CUST_ID 

我需要爲帳齡時段如創建列:

'0 - 30'信用餘額總和

'0 - 30' 信貸餘額客戶COUNT

'31 - 60' ......

我會用最大的DATEDIFF函數(TRANSACTIONS.POST_DATE)和 「昨天」 使用CASE語句 - DATEADD(dd,-1,getdate())創建桶。

但是,在執行存儲桶總計和計數計算之前,使用變量或存儲過程根據最後一次付款日期分隔客戶會不會更有效率?

關於如何準確有效地做到這一點的任何想法?到目前爲止,我一直在用簡單的查詢獲取貸方餘額和最後付款日期的客戶,然後使用Excel自己創建老化存儲桶。

回答

2

您的方法是正確的方法。我不確定爲什麼你認爲在存儲過程中做某件事比在查詢中做更有效。

我想你想查詢是這樣的:

select (case when t.DaysAgo between 0 and 30 then '0-30' 
      when t.DaysAgo between 31 and 60 then '31-60' 
      else 'OLD' 
     end), 
     <whatever you want here> 
from (SELECT ACCOUNT.CUST_ID, sum(ACCOUNT.BALANCE) as balance 
     FROM ACCOUNT 
     GROUP BY ACCOUNT.CUST_ID 
    ) a left outer join 
    (SELECT TRANSACTIONS.CUST_ID, MAX(TRANSACTIONS.POST_DATE) as LastPaymentDate, 
      datediff(d, X(TRANSACTIONS.POST_DATE), getdate()) as DaysAgo, 
     FROM TRANSACTIONS 
     WHERE TRANSACTIONS.TX_TYPE = 'PAYMENT' 
     GROUP BY TRANSACTIONS.CUST_ID 
    ) t 
    on a.cust_id = t.cust_id 
group by (case when t.DaysAgo between 0 and 30 then '0-30' 
       when t.DaysAgo between 31 and 60 then '31-60' 
       else 'OLD' 
      end) 

在一般情況下,你應該讓SQL引擎優化查詢。通常(但絕對不總是)要做好工作,讓你思考你想完成什麼。

您將有額外的邏輯來排除某些客戶並引入其他字段。

+0

謝謝,先生。這很好。 – 2012-07-12 14:40:43

+0

@戈登我發佈這個問題http://stackoverflow.com/questions/11592880/sql-aging-report這是類似於這個答案,但我的問題是,我想這樣做,但只有一個表。希望您能夠幫助我。謝謝 – VAAA 2012-07-21 14:23:49

1

我需要澄清一件事。 如果客戶可能擁有多個帳戶,並且如果付款可能發佈在不正確的帳戶上,那麼您如何處理?

意思是說,如果客戶擁有多個帳戶,您如何確定付款被過帳到錯誤的帳戶中。這是否意味着即使某個客戶擁有多個帳戶,該客戶對於不同的帳戶仍具有相同的CustID?

因爲如果每個帳戶的CustID不同,我確信沒有辦法正確處理,而不是在您當前使用的Excel中使用舊時尚方式。

感謝

+0

客戶擁有多個帳戶的相同客戶ID。將付款應用於錯誤的帳戶時,它們幾乎總是應用於其中一個客戶的其他帳戶。因此,將所有客戶賬戶的總和確保只選擇具有真實負餘額的客戶。 – 2012-07-12 14:22:34

0

有趣!我撰寫了典當行的應用程序,我們基於上次付息日的年齡走卒,或沒有興趣pymt,pawn_date的。有時候客戶的利息支付會落後2個月,但只支付1個月的利息,以避免在沒有興趣付款或贖回典當的情況下,如果他們離開了90天或更長時間就會喪失當兵。因此,我們確定(today - last_pymt_date)顯示自上次int pymt或典當日期以來經過的天數。

每個客戶可以有多個棋子,因此一個客戶主記錄會加入許多典當詳細記錄。這是向正確的客戶發佈付款的正確方式,您可以找到特定的典當記錄,使用pymt進行更新,然後您可以查詢每個客戶的典當以獲得每個客戶的到期總額。