通过以下查询,我尝试选择日期(总共12个), 在一个表中,但满足某些限制,对于此查询 我有两块板连在一起用于一个dni:
1.-日期1(日期nac = 19-04-2016)如果此日期存在,则在7个月之前的6个月至2天之间搜索BD中的日期 更及时的日期= OPPORTUNO:25-10-2016。 如果您没有找到它,请查找6个月之间至35个月之前最多2天的日期(如果此日期存在) 把NO OPORTUNO和日期= NO OPORTUNO:06-05-2017。
2.-日期2根据前一日期查找日期(OPORTUNO:25-10-2016)> = 28天和< = 32天,如果存在的话 把ooportuno和日期= Oportuno:23-11-2016。 如果您没有找到它,请根据上一个日期查找日期(不是OPPORTUNE:06-05-2017)> = 30天和< = 929天,如果存在的话 没有oprtuno和日期= NO OPPORTUNO:13-07-2016。
2.-日期3根据前一日期寻找日期(OPORTUNO:23-11-2016)> = 28天和< = 32天,如果存在 把oportuno和日期= OPORTUNO:25-12-2016。 如果您没有找到它,请根据上一个日期查找日期(NOT OPORTUNO:13-07-2016)> = 30天和< = 929天,如果存在的话 没有oprtno和日期= NO OPORTUNO:10-28-2016。
并且在第12天到期之前,其他日期也是如此。
我所做的是将DATE 1的DATE 1置于条件状态,但是日期2嵌套在3 .....直到12日。 我跑到第7天但是从第8天开始显示错误:查询处理器耗尽了内部资源,无法生成查询计划。我将发布一个示例查询结果。
(CASE
WHEN
EXISTS(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )
THEN
(select concat('OPORTUNO: ',(Select CONVERT( VARCHAR, (SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )))))
when
EXISTS(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )
then
(select concat('NO OPORTUNO: ',(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )))
else ''
END) AS [FECHA 1 (SF)]
,
(CASE
WHEN
EXISTS(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )
AND
EXISTS(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )
THEN
(select concat('OPORTUNO: ',(Select CONVERT( VARCHAR, (SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )))))
when
EXISTS(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )
then
(select concat('NO OPORTUNO: ',(Select CONVERT( VARCHAR,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )))))
else ''
END) AS [FECHA 2 (SF)]
,
(CASE
WHEN
EXISTS(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )
and
EXISTS(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )
THEN
(select concat('OPORTUNO: ',(Select CONVERT( VARCHAR, (SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(DD ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 28 AND 32)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )))))
when
EXISTS(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )
then
(select concat('NO OPORTUNO: ',(Select CONVERT( VARCHAR,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(SELECT top 1 FECHA FROM dbo.z298 WHERE
((DATEDIFF(day ,(DATEADD(MONTH,5,(SELECT (REPORTE_ALTAS_BAJAS.[FECHA DE NACIMIENTO
DEL NIÑO(DD/MM/AAAA)]) FROM dbo.REPORTE_ALTAS_BAJAS where dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI))),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI ),fecha)
) BETWEEN 30 AND 929)
and dbo.REPORTE_ALTAS_BAJAS.[NUMERO DEL
DOCUMENTO DE IDENTIDAD
DEL NIÑO] = dbo.z298.DNI )))))
else ''
END) AS [FECHA 3 (SF)]
Imgage whit the table structure and the result of this query
答案 0 :(得分:0)
我不了解你的算法,你为什么使用重叠范围([28-32],[30-929])而且我不确定这是不是一个好主意将所有时间从dateiffs转换为dateiffs几天,但整个解决方案可能如下所示:
SELECT z.dni,
z.FECHA,
CASE
WHEN DATEDIFF(DAY, r.dt, z.FECHA) BETWEEN 28 AND 30 THEN 'asdf1'
WHEN DATEDIFF(DAY, r.dt, z.FECHA) BETWEEN 30 AND 929 THEN 'asdf2'
...
END
FROM dbo.z298 z
CROSS APPLY (
SELECT TOP 1 DATEADD(MONTH, 5, r.[FECHA DE NACIMIENTO DEL NINO(DD/MM/AAAA)]) dt
FROM dbo.REPORTE_ALTAS_BAJAS r
WHERE r.[NUMERO DEL DOCUMENTO DE IDENTIDAD DEL NINO] = z.DNI
AND r.[FECHA DE NACIMIENTO DEL NINO(DD/MM/AAAA)] <= DATEADD(MONTH, -6, z.FECHA)
ORDER BY dt DESC
) r
也许必须将其还原:FROM REPORTE... CROSS APPLY (... FROM z298...)
我真的不确定术语&#34;嵌套日期&#34;适用于您的任务。但如果是,那么你可能想尝试二次CTE而不是制作子查询。