SQL:基于财务报告的上次付款日期创建账龄桶

SQL:基于财务报告的上次付款日期创建账龄桶,sql,sql-server-2008,tsql,financial,accounting,Sql,Sql Server 2008,Tsql,Financial,Accounting,我需要在客户层面创建信用余额的账龄报告 注: 账龄根据客户的最后付款日期确定 一个客户可以有多个帐户,而且有时会出现错误,将付款应用到错误的帐户。例如,账户余额为15美元的客户支付15美元。这15美元的付款可能会被应用到错误的帐户,使客户在一个帐户上的余额为-15美元,在另一个帐户上的余额为15美元。此客户需要从报告中排除 获取客户信用余额的SQL: SELECT ACCOUNT.CUST_ID , sum(ACCOUNT.BALANCE) FROM ACCOUNT GROUP BY

我需要在客户层面创建信用余额的账龄报告

注:

账龄根据客户的最后付款日期确定

一个客户可以有多个帐户,而且有时会出现错误,将付款应用到错误的帐户。例如,账户余额为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
我需要为老化存储桶创建列,例如:

“0-30”贷方余额总和

“0-30”贷方余额客户计数

“31-60”

我打算在maxTRANSACTIONS.POST_DATE和dayed-DATEADDdd,-1,getdate之间使用DATEDIFF函数来创建bucket

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


关于如何准确有效地完成这项工作,有什么想法吗?到目前为止,我一直在一个简单的查询中找到有信用余额的客户以及他们最后的付款日期,然后自己使用Excel创建账龄桶

你的方法是正确的。我不知道为什么您认为在存储过程中执行某些操作比在查询中执行更有效

我想您需要一个类似以下内容的查询:

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引擎优化查询。通常是这样,但肯定不总是这样!做好工作,让你思考你想要完成什么


您将有额外的逻辑来排除某些客户,并引入其他字段。

我需要澄清一件事。 如果一个客户可能有多个帐户,并且如果一笔付款可能过账到错误的帐户,您如何处理

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

因为如果每个帐户的CustID都不一样,我真的相信除了使用您当前使用的Excel中的旧方式之外,没有办法正确处理它


谢谢,真有趣!。。我编写了一个当铺应用程序,我们根据最后一次付息日期或在没有利息pymt的情况下,根据当铺日期对当铺进行账龄计算。有时,客户拖欠2个月的利息,但如果他们在90天或更长时间内未支付利息或赎回典当,则只需支付1个月的利息,以避免没收典当。因此,我们使用今天-last_pymt_date来显示自上次int pymt或典当日期以来经过的天数


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

对于多个帐户,客户具有相同的客户ID。当付款应用于错误的帐户时,几乎总是应用于客户的其他帐户之一。所以按客户计算所有账户的总和可以确保只选择真正负余额的客户。@Gordon我发布了这个问题,这个问题与这个答案类似,但我的问题是我想这样做,但只选择一个表。希望你能帮助我。谢谢
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)