Principales respuestas
variables de consulta en subconsultas

Pregunta
-
Cordial saludo.
Estoy trabajando con Sql Server, como hago para traer los resultados de una consulta a una subconsulta para realizar comparaciones. ej:
Necesito capturar el valor de los campos crefechgeneinte , Ti_UltCuoVen para utilizarlo en la ultima subconsulta, resalto en negrita los campos que necesito validarDECLARE @Sdt_FecPag SMALLDATETIME
DECLARE @P_NumCre INT
set @Sdt_FecPag = '01/01/1900'
SET @P_NumCre = 130058
declare @crefechgeneinte smalldatetime
SELECT
c.crenumero
, c.crefechgeneinte
, isnull(pp3.Ti_UltCuoVen, 0) as Ti_UltCuoVen
, case isnull(pp3.Ti_UltCuoVen, 0) when 0 then c.crefechgeneinte else pp3.Sdt_FecUltCuoVen end as Sdt_FecUltCuoVen
, dia.D_IntCorCS
FROM
dbo.vistintecorr as c
left outer join (
SELECT
ppcuota as Ti_UltCuoVen
, ppfecha as Sdt_FecUltCuoVen
, crenumero
FROM
dbo.planpago
WHERE
ppfecha <= @Sdt_FecPag
AND ppcuota = (
SELECT MAX(ppcuota) FROM planpago as ppn
WHERE ppn.crenumero = dbo.planpago.crenumero
AND ppfecha <= @Sdt_FecPag
)
) as pp3 on pp3.crenumero = c.crenumero
left outer join (
SELECT SUM(diavalointe - diaabonsubs) as D_IntCorCS, crenumero
FROM dbo.diario
WHERE diaestado = 'CS'
AND diafecha < (select case isnull(Ti_UltCuoVen, 0) when 0 then c.crefechgeneinte else pp.ppfecha end as ppfecha
FROM planpago as pp
WHERE pp.crenumero=dbo.diario.crenumero and
pp.ppfecha <= @Sdt_FecPag
AND pp.ppcuota = (
SELECT MAX(pp2.ppcuota) FROM planpago as pp2
WHERE pp2.crenumero = dbo.diario.crenumero
AND pp2.ppfecha <= @Sdt_FecPag
))
group by crenumero
) as dia on dia.crenumero = c.crenumero
WHERE c.crenumero = @P_NumCre
ORDER BY c.crenumeroAgradezco de antemano la ayuda que me puedan brindar
Respuestas
-
con ese pedazo de consulta es difícil ayudarte sin salir mareado
para hacer lo que quieres necesitas en lugar de hacer un left outer join usar cross outer apply, en tu caso es lo mismo simplemente que en lugar de usar la sintaxis para join de on x=y los valores se toman dentro de la función. No necesitas implementar una función externa puedes usar cross apply con una subselect, te pongo un ejemplo para que se ilustre... mas o menos
select * from INFORMATION_SCHEMA.TABLES t cross apply (select case when t.TABLE_NAME like 'A%' then 'empieza por a' else 'no empieza por a'end as nuevocampo ) b
Comparte lo que sepas, aprende lo que no sepas (FGG)
portalSQL
El rincón del DBA- Propuesto como respuesta Tonatiuh AbregoModerator jueves, 5 de abril de 2018 15:18
- Marcado como respuesta Tonatiuh AbregoModerator martes, 10 de abril de 2018 18:14
-
Cordial saludo.
Gracias por la respuesta; para mi caso utilice el outer apply y si funciona muchas gracias
- Marcado como respuesta carlostattojk jueves, 19 de abril de 2018 14:18
Todas las respuestas
-
con ese pedazo de consulta es difícil ayudarte sin salir mareado
para hacer lo que quieres necesitas en lugar de hacer un left outer join usar cross outer apply, en tu caso es lo mismo simplemente que en lugar de usar la sintaxis para join de on x=y los valores se toman dentro de la función. No necesitas implementar una función externa puedes usar cross apply con una subselect, te pongo un ejemplo para que se ilustre... mas o menos
select * from INFORMATION_SCHEMA.TABLES t cross apply (select case when t.TABLE_NAME like 'A%' then 'empieza por a' else 'no empieza por a'end as nuevocampo ) b
Comparte lo que sepas, aprende lo que no sepas (FGG)
portalSQL
El rincón del DBA- Propuesto como respuesta Tonatiuh AbregoModerator jueves, 5 de abril de 2018 15:18
- Marcado como respuesta Tonatiuh AbregoModerator martes, 10 de abril de 2018 18:14
-
Cordial saludo.
Gracias por la respuesta; para mi caso utilice el outer apply y si funciona muchas gracias
- Marcado como respuesta carlostattojk jueves, 19 de abril de 2018 14:18