アカウントの延滞レポートを生成するタスクを与えられました。
これは、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
このクエリの結果は、今日と結果の日付の差 (日数) を計算する次のクエリに渡されます。