0

我的任务是生成账户欠款报告。

这是相当直截了当的,除了 1 列 DaysInArrears。

我创建了一个查询,用于计算每次预定付款时帐户的欠款状态。

此查询使用类似于以下结果的临时表 (#ArrearAnalysis) 填充:

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

1

如果我们可以相信 RN(行号?)是按顺序编号的,那么我们正在寻找两个相邻的记录,其中最近的记录的 ArrearsStatus = 1,而前一个记录的 ArrearsStatus = 0(或不存在,例如 NULL)。我们希望 ArrearsStatus = 1 记录的日期与最近的此类事件相关联:

SELECT MAX(aa1.DueDate) AS MaxDueDate
FROM #ArrearsAnalysis aa1
LEFT JOIN #ArrearsAnalysis aa2
ON aa2.RN = aa1.RN - 1
WHERE aa1.ArrearsStatus = 1
AND (aa2.ArrearsStatus = 0 OR aa2.ArrearsStatus IS NULL)

如果我们不能信任 RN,我们将不得不从基于日期的连接条件开始(ON aa2.DueDate < aa1.DueDate),然后找到其他方式来建立邻接关系。(可能在中间日期进行第三次自加入,然后坚持中间日期为 NULL...)

基于集合的方法通常比循环更好。在这种情况下,只有当数据最终使基于集合的方法不切实际时,我才会使用游标循环。

您可以添加 aa1.AgreementID 分组。我认为我们不需要#ArrearsCheck。

更新

上面的答案适用于最初表述为“在他们陷入最新欠款时解决”的问题。关于“最早拖欠”的问题,其实有点意思。我们不能只切换到 MIN(),因为我们希望只有在 AgreementID 从一开始就拖欠并且从未从 0 过渡到 1 时才能看到初始的 DueDate。

在我看来,最直接的解决方案是找到每种情况的 MIN() 日期,然后选择这两个值的 MAX()。空值应该从聚合中退出。

SELECT b.AgreementID,
MAX(b.MinDueDate) AS FirstArrearsDate
FROM (
SELECT aa1.AgreementID,
MIN(aa1.DueDate) AS MinDueDate
FROM #ArrearsAnalysis aa1
LEFT JOIN #ArrearsAnalysis aa2
ON aa2.RN = aa1.RN - 1
WHERE aa1.ArrearsStatus = 1
AND aa2.ArrearsStatus = 0
GROUP BY aa1.AgreementID
UNION ALL
SELECT aa1.AgreementID,
MIN(aa1.DueDate) AS MinDueDate
FROM #ArrearsAnalysis aa1
LEFT JOIN #ArrearsAnalysis aa2
ON aa2.RN = aa1.RN - 1
WHERE aa1.ArrearsStatus = 1
AND aa2.ArrearsStatus IS NULL
GROUP BY aa1.AgreementID
) AS b
GROUP BY b.AgreementID
于 2013-05-22T14:01:56.567 回答