首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL:基于财务报告的最后付款日期创建老化桶

SQL:基于财务报告的最后付款日期创建老化桶
EN

Stack Overflow用户
提问于 2012-07-12 13:06:42
回答 3查看 17.5K关注 0票数 4

我需要在客户层面上创建一份信用余额老化报告。

备注:

  1. 老化是基于客户的最后一次付款日期。
  2. 客户可以有多个帐户,有时会出现错误,将付款应用于错误的帐户。例如,帐户上有15美元余额的客户支付15美元。这15美元的支付可能被应用到错误的帐户上,使客户在一个帐户上有一个$-15的余额,而在另一个帐户上留下$15的余额。需要将此客户排除在报表之外。

获得具有信用余额的客户的SQL:

代码语言:javascript
运行
复制
SELECT 
  ACCOUNT.CUST_ID
, sum(ACCOUNT.BALANCE)

FROM ACCOUNT

GROUP BY ACCOUNT.CUST_ID

HAVING sum(ACCOUNT.BALANCE) < 0

获取最新付款日期的SQL:

代码语言:javascript
运行
复制
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自己创建了老化的桶。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-12 13:48:14

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

我想你想要一个查询,比如:

代码语言:javascript
运行
复制
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引擎优化查询。它通常是(但绝对不是总是如此!)要把工作做好,让你想想你想要完成的事情。

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

票数 3
EN

Stack Overflow用户

发布于 2012-07-12 13:56:00

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

意思是,如果客户有一个以上的帐户,你如何确定一笔付款是存入错误的帐户。这是否意味着即使某个客户拥有多个帐户,客户对于不同的帐户仍然拥有相同的CustID?

因为如果每个帐户的CustID是不同的,我真的认为没有办法正确地处理这个问题,而不是在当前使用的Excel中使用旧的时尚方式。

谢谢

票数 1
EN

Stack Overflow用户

发布于 2012-07-14 01:32:41

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11452498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档