0

アカウントの延滞レポートを生成するタスクを与えられました。

これは、DaysInArrears という 1 つの列を除けば、かなり単純明快です。

スケジュールされた支払いごとにアカウントの延滞状況を解決するクエリを作成しました。

このクエリは、一時テーブル (#ArrearsAnalysis) に次のような結果を入力します。

AgreementID DueDate     AmountDue DueTD  PaidTD FirstPaymentDue ArrearsStatus   RN
184         2013-03-11  75.00     75.00  0.00   2013-03-11      1               1
184         2013-03-25  75.00     150.00 0.00   2013-03-11      1               2
184         2013-04-08  75.00     225.00 300.00 2013-03-11      0               3
184         2013-04-22  75.00     300.00 300.00 2013-03-11      0               4
184         2013-05-03  75.00     375.00 300.00 2013-03-11      1               5
184         2013-05-20  75.00     450.00 300.00 2013-03-11      1               6

次のクエリから入力された別の一時テーブル (#ArrearsCheck) もあります。

INSERT INTO #ArrearsCheck
SELECT 
    AgreementID, 
    SUM(ArrearsStatus),
    MAX(RN)
FROM 
    #ArrearsAnalysis 
GROUP BY 
    AgreementID

次に行う必要があるのは、行を逆に見て、最新の延滞 (延滞スコア 1) に該当する時期を特定することです。

したがって、上記の例では、2013 年 3 月 5 日の結果が予想されます。

アカウントが一度も支払いを受けていない場合は、FirstPaymentDue Date を返します。アカウントが一度も滞納していない場合は、NULL を返します。

これまでのところ、非支払者と非滞納者を扱っている私のクエリは次のとおりです。上記を解決するためのループに関するヘルプが必要です (* * で強調表示):

SELECT
    DISTINCT(A.AgreementID),
    CASE WHEN (C.ArrearsTally <= 0) 
    THEN NULL 
    ELSE (CASE WHEN (C.ArrearsTally = C.PaymentCount) 
          THEN NULL 
          *ELSE 0* 
          END) 
    END AS ArrearsDate
FROM
    #ArrearsAnalysis AS A
LEFT OUTER JOIN
    #ArrearsCheck AS C ON A.AgreementID = C.AgreementID

このクエリの結果は、今日と結果の日付の差 (日数) を計算する次のクエリに渡されます。

4

1 に答える 1