自第171个日期起连续171天,并且自上一个处理/营业日期(即PROCDATE)起出现第171个日期。我编写了以下查询,本质上利用了两个CTE,但它不起作用。具体来说,它产生的帐户至少要连续41天到期171天,但截止最后一个处理日期(即PROCDATE)才到期。我也无法报告可能已降至41天以下的贷款,并且我也无法报告已逾期至少41天,但仅需171天的贷款,除非它们在PROCDATE达到171,所以为了进一步说明我需要报告,大多数与以下情况有关: 1.帐户跌破41天以上,然后最终保持> = 41天并持续171天。我只想报告从PROCDATE起连续171个工作日到期超过41天的此类贷款。 2.帐户的到期日大于等于41天,并且从PROCDATE开始连续171天未超过41天。 3.帐户的到期日为> = 41天,然后从PROCDATE到41岁以下,并且永远不会超过41天至100天以上。 我确定还有其他情况,但是我需要捕获截至最后一个处理日的条件的帐户,即PROCDATE。我无法在两天或两天前,一周前等的时间报告符合条件的贷款。这很关键。
很遗憾,我的报告未包含符合PROCDATE标准的贷款。它会捕获过去> = 41天的所有贷款,而不论PROCDATE和何时>> 41天。一笔贷款符合条件,但截至20181101年,而不是直到今天的PROCDATE才是昨天的20181206。重要的是,它也没有正确地捕获上次过期到期的贷款,贷款期限为== 41天。以下代码报告中的一笔贷款已过期逾期100天,而自PROCDATE以来,自20160611(及之前)以来已过期122天,但在20181129达到了171天。我认为喜欢这种解决方案– SET @错误BEGDATE从PROCDATE退了171天,但没有考虑,然后他们开始了== 41天。我的第一份和单独的报告仅查看了所有到期日大于或等于41天的贷款,而前一天的到期时间(每次)均小于41天。简而言之,解决方案是: (((ISNULL(li.PDDAYSREG,0)> = 42)和ISNULL(ld.PDDAYSREG,0)<42)
此报告使用的表(使用的字段名称非常不言自明): dbo.dim_dates =所有FULLDATE的趋势表,即所有处理日期都可以追溯到20071231 dbo.tbl_Daily_Processing_Dates =各种处理日期的每日表格,即PROCDATE =上次处理/营业日期 dbo.tbl_loan_daily_info =所有帐户的许多字段的每日表 dw.Loan_Daily_Info =趋势/历史表,其中包含dbo.tbl_loan_daily_info中的大多数相同字段
DECLARE @BEGDATE datetime, @PROCDATE datetime;
SET @PROCDATE = (SELECT PROCDATE FROM
dbo.tbl_Daily_Processing_Dates);
SET @BEGDATE = (SELECT NextProcessingDate FROM dbo.dim_Dates WHERE
FullDate = DATEADD(dd, -171, @PROCDATE));
WITH PD_CTE (PROCDATE, ACCTNO, NXTPAYDATE, LSTPMTDATE, PDDAYS,
PDITOT)
AS (
SELECT PROCDATE, ACCTNO, NXTPAYDATE, LSTPMTDATE, PDDAYSREG
FROM dbo.tbl_Loan_Daily_Info
WHERE PDDAYS BETWEEN 41 AND 211 --221=41+170
),
PDMINMAX_CTE (ACCTNO, MIN_PDDAYS, MAX_PDDAYS, DAY_COUNT, MIN_DATE,
MAX_DATE)
AS (
SELECT
A.ACCTNO, MIN(B.PDDAYS) as MIN_PDDAYS, MAX(B.PDDAYS) as MAX_PDDAYS,
COUNT(*) AS DAY_COUNT, MIN(B.FILEDATE) as MIN_DATE,
MAX(B.FILEDATE) as MAX_DATE
FROM PD_CTE as A
INNER JOIN dw.Loan_Daily_Info as B
ON A.ACCTNO = B.ACCTNO AND B.ACTYPE = 'L'
WHERE B.FILEDATE BETWEEN @BEGDATE AND @PROCDATE
GROUP BY A.ACCTNO
)
SELECT *, DATEDIFF(dd, MIN_DATE, MAX_DATE) as DATE_DIFF, @PROCDATE,
@BEGDATE
FROM PDMINMAX_CTE
WHERE MIN_PDDAYS >= 41 AND MAX_PDDAYS >= 41
ORDER BY ACCTNO;
`
答案 0 :(得分:0)
这里有很多信息,但是您应该使用CASE语句。您正在使用where子句分隔日期,但是可以对此执行CASE语句,然后根据需要调用该字段。