我需要在客户层面上创建一份信用余额老化报告。
备注:
获得具有信用余额的客户的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”贷方余额客户计数
“31-60”
我打算用CASE语句在max(TRANSACTIONS.POST_DATE)和“昨天”之间使用DATEDIFF函数- DATEADD(dd,-1,getdate())来创建桶。
但是,在执行桶和计数计算之前,使用变量或存储过程来根据最后的付款日期分离客户,这样做不是更有效吗?
对于如何准确有效地完成这一任务,有什么想法吗?到目前为止,我已经在一个简单的查询中收集了有信用余额的客户以及他们最后的付款日期,然后使用Excel自己创建了老化的桶。
发布于 2012-07-12 13:48:14
你的方法是正确的。我不知道为什么您认为在存储过程中执行某些操作比在查询中执行更有效。
我想你想要一个查询,比如:
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引擎优化查询。它通常是(但绝对不是总是如此!)要把工作做好,让你想想你想要完成的事情。
您将有更多的逻辑来排除某些客户并引入其他字段。
发布于 2012-07-12 13:56:00
我需要澄清一件事。如果客户可能有一个以上的帐户,如果付款可能在不正确的帐户上,您如何处理?
意思是,如果客户有一个以上的帐户,你如何确定一笔付款是存入错误的帐户。这是否意味着即使某个客户拥有多个帐户,客户对于不同的帐户仍然拥有相同的CustID?
因为如果每个帐户的CustID是不同的,我真的认为没有办法正确地处理这个问题,而不是在当前使用的Excel中使用旧的时尚方式。
谢谢
发布于 2012-07-14 01:32:41
有意思!.。我编写了一个当铺应用程序,我们根据上一次支付利息的日期,或者在没有利息的情况下,使用pawn_date对典当进行老化。有时客户在利息支付上落后2个月,但如果他们在90天或更长时间内没有支付利息pymt或赎回典当,则只能支付1个月的利息以避免没收典当。因此,我们可以(今天- last_pymt_date)显示自上一次int、pymt或典当日期以来经过的天数。
每个客户可以拥有多个典当,因此一个客户主记录连接到多个典当细节记录。这是向正确客户发送付款的正确方式,您定位特定的典当记录,用pymt更新,然后您可以查询每个客户的典当,以获得每个客户的应付总额。
https://stackoverflow.com/questions/11452498
复制相似问题