我需要在客户层面上创建一份信用余额老化报告。
备注:
获得具有信用余额的客户的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引擎优化查询。它通常是(但绝对不是总是如此!)要把工作做好,让你想想你想要完成的事情。
您将有更多的逻辑来排除某些客户并引入其他字段。
https://stackoverflow.com/questions/11452498
复制相似问题