none
variables de consulta en subconsultas RRS feed

  • 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 validar

    DECLARE @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.crenumero

    Agradezco de antemano la ayuda que me puedan brindar

    miércoles, 4 de abril de 2018 16:41

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

    jueves, 5 de abril de 2018 11:03
    Moderador
  • 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
    viernes, 13 de abril de 2018 14:46

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

    jueves, 5 de abril de 2018 11:03
    Moderador
  • 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
    viernes, 13 de abril de 2018 14:46