4

顧客レベルのクレジット残高のエージングレポートを作成する必要があります。

ノート:

  1. 経年劣化は、お客様の最終支払い日に基づいています。

  2. 顧客は複数のアカウントを持つことができ、間違ったアカウントに支払いが適用されるというエラーが発生することがあります。たとえば、アカウントに15ドルの残高がある顧客は、15ドルの支払いを行います。その15ドルの支払いが間違ったアカウントに適用され、顧客の1つのアカウントに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 か月遅らせることがありますが、1 か月の利息のみを支払うことで、利息の支払やポーンの償還を行わずに 90 日以上経過した場合に、ポーンが没収されないようにします。したがって、(today - last_pymt_date) を実行して、最後の int pymt またはポーン日付からの経過日数を表示します。

各顧客は複数のポーンを持つことができるため、1 つの顧客マスター レコードが多くのポーン詳細レコードに結合されます。これは、正しい顧客に支払いを転記するための適切な方法です。特定のポーン レコードを見つけ、pymt で更新してから、各顧客のポーンにクエリを実行して、各顧客の合計支払額を取得できます。

于 2012-07-14T01:32:41.007 に答える