4

我需要在客户级别创建信用余额账龄报告。

笔记:

  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' 信用余额客户数量

'31 - 60'...

我打算在 max(TRANSACTIONS.POST_DATE) 和 "yesterday" - DATEADD(dd,-1,getdate()) 之间使用 DATEDIFF 函数使用 CASE 语句来创建存储桶。

但是,在执行存储桶总和和计数计算之前,使用变量或存储过程根据最后付款日期来分离客户不是更有效吗?

关于如何准确有效地做到这一点的任何想法?到目前为止,我一直在通过一个简单的查询来获取具有信用余额的客户以及他们的最后付款日期,然后自己使用 Excel 创建老化桶。

4

3 回答 3

3

你的方法是正确的方法。我不确定为什么你认为在存储过程中做某事会比在查询中做更有效。

我想你想要一个类似的查询:

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-12T13:48:14.770 回答
1

我需要澄清一件事。如果客户可能有多个帐户,并且付款可能会在不正确的帐户上过帐,您如何处理?

意思是,如果客户有多个帐户,您如何确定将付款过帐到错误的帐户。这是否意味着即使某个客户拥有多个帐户,该客户对于不同的帐户仍然具有相同的 CustID?

因为如果每个帐户的 CustID 不同,我真的相信没有办法正确处理它,而不是使用您当前使用的 Excel 中的旧时尚方式。

谢谢

于 2012-07-12T13:56:00.977 回答
0

有趣!.. 我编写了一个当铺应用程序,在该应用程序中,我们根据最后的利息支付日期或在没有利息 pymt 的情况下,pawn_date 对典当进行老化。有时客户在利息支付上落后 2 个月,但如果他们 90 天或更长时间没有支付利息或赎回典当,则只需支付 1 个月的利息以避免没收典当。因此,我们使用 (today - last_pymt_date) 来显示自上次 int pymt 或典当日期以来经过的天数。

每个客户可以有多个典当,因此一个客户主记录连接到多个典当详细记录。这是向正确客户付款的正确方法,您找到特定的典当记录,使用 pymt 更新,然后您可以查询每个客户典当以获得每个客户的总金额。

于 2012-07-14T01:32:41.007 回答