我需要在客户级别创建贷方余额的老化报告。
注意:
老龄化取决于客户的上一个付款日期。
客户可以拥有多个帐户,并且有时会将错误付款应用于错误的帐户。例如,账户余额为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'CREDIT BALANCE SUM
'0 - 30'信用余额客户计数
'31 - 60'......
我打算在max(TRANSACTIONS.POST_DATE)和“昨天” - DATEADD(dd,-1,getdate())之间使用DATEDIFF函数创建CASE语句来创建存储桶。
但是,使用变量或存储过程在执行存储桶总数和计数计算之前根据上次付款日期将客户分开是不是更有效率?
有关如何准确有效地执行此操作的任何想法?到目前为止,我一直在简单的查询中使用贷方余额和最后一个付款日期来接收客户,然后使用Excel自行创建老化桶。
答案 0 :(得分: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引擎优化查询。通常(但绝对不总是!)会做得很好,让你考虑你想要完成的事情。
您可以使用其他逻辑来排除某些客户并引入其他字段。
答案 1 :(得分:1)
我需要澄清一件事。 如果客户可能拥有多个帐户,并且付款可能会在错误的帐户上发布,那么您如何处理?
意思是,如果客户有多个帐户,您如何确定付款被过帐到错误的帐户。这是否意味着即使某个客户拥有多个帐户,该客户仍然拥有不同帐户的相同CustID?
因为如果每个帐户的CustID不同,我真的相信没有办法正确处理,而不是在您当前使用的Excel中使用旧时尚方式。
由于
答案 2 :(得分:0)
有意思!..我创作了一个当铺应用程序,根据最后一个利息支付日期,或者在没有兴趣pymt,pawn_date的情况下,我们根据当前年龄。有时客户的利息支付落后2个月,但只需支付1个月的利息,以避免在没有利息pymt或兑现典当的情况下90天或更长时间内没收该典当。因此,我们(今天 - last_pymt_date)显示自上一个int pymt或pawn date以来经过的天数。
每个客户可以拥有多个典当,因此一个客户主记录可以连接到许多典当明细记录。这是将付款过帐到正确客户的正确方法,您找到特定的典当记录,使用pymt更新,然后您可以查询每个客户的典当以获得每个客户的应付总金额。