none
Left Join no esta llamando todos los campos RRS feed

  • Pregunta

  • Hola, buenas noches.

    El objetivo de acudir a ustedes, es pedir de su ayuda ya que actualmente estoy haciendo una consulta SQL que hace una comparación de un campo y lo muestra a la par.

    Es decir, el objetivo es que yo tengo un campo A y en el campo A guardo "N" cantidad de documentos que son numericos, y que posteriormente, estos documentos se liquidan y se le agrega un prefijo "NCI" entonces, con esta consulta lo que hago es saber a través de un LIKE cuales ya fueren liquidados y lo que deseo con el Left Join es saber cuales aun estan vivos en el sistema.

    Pero lamentablemente, no logro que el Left Join llame a todos los campos de la tabla de la izquierda, me podrian ayudar por favor.

    SELECT C.Id, C.Description, 
    CASE
        WHEN D.Documento IS NULL THEN D.Key_Code
        ELSE D.Documento
    END AS Documento, 
    CASE
        WHEN D2.Documento IS NULL THEN D2.Key_Code
        ELSE D2.Documento
    END AS NCI, 
    CONVERT(VARCHAR(10),D.Transaction_Date,103) as Transaction_Date, 
    CONVERT(VARCHAR(10),D2.Transaction_Date,103) as Transaction_Date_NCI, 
    D.Num_Batch, D.Concepto Concepto_Doc, D2.Concepto Concepto_NCI, 
    D.Key_Code, D.Reference,
    CASE 
        WHEN D2.Type = 'DR'  THEN D.Valor
        WHEN D2.Type IS NULL THEN D.Dr 
    END AS Cargo,
    CASE 
        WHEN D.Type = 'CR'  THEN D.Valor
        WHEN D.Type IS NULL THEN D.Cr 
    END AS Abono
     From ter_auxi_cont_t D Left Outer Join ter_auxi_cont_t D2 On (D2.Documento like 'NCI%'+D.Documento), account C
            where 
            C.id = D.Cuenta
            And C.id = D2.Cuenta   
            And D.Transaction_Date between '20160601' and '20170524'
            And D.Cuenta between '21020202' and '21020202'

     

    viernes, 26 de mayo de 2017 0:50

Respuestas

  • ...únicamente me llama los campos del 'Documento', ahí pone las NCI y los documentos generados, y no me aparecen a la par como inicialmente buscaba e igualmente en el campo 'NCI' todos me aparecen con valor null.

    ¿Has ejecutado la consulta tal y como yo la he escrito?, de haber realizado cambios, ¿podrías adjuntar la consulta con los cambios realizados?

    No hay ciencia en lo que te propongo, se trata de combinar la misma tabla entendiendo que el segundo conjunto agrega únicamente el literal 'NCI' como prefijo al número de documento, es decir, conjunto a: 100, conjunto b: NCI100, y la expresión de combinación es: NCI100 (concateno NCI a 100) = NCI100, como ves es simple y se espera los resultados adecuados.

    Por otro lado, la expresión: 'COALESCE(D.Documento, D.Key_Code) AS Documento', ¿la columna D.Documento permite NULL a pesar de ser la columna por la que comparas ambos conjuntos?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 27 de mayo de 2017 22:31
  • Hola, en este ejemplo:

    Te comparto que únicamente me llama los campos del 'Documento', ahi pone las NCI y los documentos generados, y no me aparecen a la par como inicialmente buscaba e igualmente en el campo 'NCI' todos me aparecen con valor null unicamente.

    Gracias nuevamente por la ayuda.

    Hola, entiendo que con esto te refieres al ejemplo que y te pase y si en efecto esa ultima coma esta demás asi como el alias prueba asi

    From ter_auxi_cont_t D 
    Left  Join ter_auxi_cont_t D2 On (D2.Documento like 'NCI%'+D.Documento) AND D.id=D2.Cuenta 
    Left Join  account C  ON C.id = D.Cuenta
    
    where
    
     D.Transaction_Date between '20160601' and '20170524'
            And D.Cuenta between '21020202' and '21020202'
    en lugar de C la D que ya es  un alias definido el C lo defines en el segundo join es por eso el error, ya lo corregí en mi primer post


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Saludos. Lima-Perú.


    sábado, 27 de mayo de 2017 19:43

Todas las respuestas

  • Esque lo estas filtrando en el where con la tabla account C, en todo caso podrías intentar hacer left join con esta tabla también, fíjate que el C.id=D2.Cuenta también puede quitarte registros esperados en ese filtro

    From ter_auxi_cont_t D

    Left Join ter_auxi_cont_t D2 On (D2.Documento like 'NCI%'+D.Documento) AND D.id=D2.Cuenta Left Join account C ON C.id = D.Cuenta where D.Transaction_Date between '20160601' and '20170524' And D.Cuenta between '21020202' and '21020202'




    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Saludos. Lima-Perú.




    • Editado Augusto1982 sábado, 27 de mayo de 2017 19:44
    viernes, 26 de mayo de 2017 2:13
  • La descripción que haces del problema complica entender el contexto: "...entonces, con esta consulta lo que hago es saber a través de un LIKE cuales ya fueren liquidados y lo que deseo con el LEFT JOIN es saber cuales aun están vivos en el sistema." "...posteriormente, estos documentos se liquidan y se le agrega un prefijo 'NCI'"

    Pregunta, cuando un documento se líquida, ¿se actualiza el número de documento agregando el prefijo NCI o se agrega una nueva fila (duplica) conteniendo el número de documento con el prefijo 'NCI'?, si es lo primero entonces no aplica hacer un SELF JOIN, si es lo segundo entonces la combinación no es correcta.

    Antes de proponer una solución, ¿podrías aclarar el contexto?

    viernes, 26 de mayo de 2017 3:15
  • La descripción que haces del problema complica entender el contexto: "...entonces, con esta consulta lo que hago es saber a través de un LIKE cuales ya fueren liquidados y lo que deseo con el LEFT JOIN es saber cuales aun están vivos en el sistema." "...posteriormente, estos documentos se liquidan y se le agrega un prefijo 'NCI'"

    Pregunta, cuando un documento se líquida, ¿se actualiza el número de documento agregando el prefijo NCI o se agrega una nueva fila (duplica) conteniendo el número de documento con el prefijo 'NCI'?, si es lo primero entonces no aplica hacer un SELF JOIN, si es lo segundo entonces la combinación no es correcta.

    Antes de proponer una solución, ¿podrías aclarar el contexto?

    Hola, buenas noches.

    Con gusto te explico un poco mas, y las disculpas del caso por no ser tan explicito.

    Cuando tenemos un documento 1234 por un valor de $100, dias despues se crea un nuevo registro con el prefijo NCI, el cual seria NCI-1234 por un valor de -$100 para hacer un valor de cero, entonces respondiendo tu pregunta, seria la opcion numero dos.

    Espero haber aclarado, y cualquier duda estoy a la orden.

    Atte.

    viernes, 26 de mayo de 2017 3:28
  • Esque lo estas filtrando en el where con la tabla account C, en todo caso podrías intentar hacer left join con esta tabla también, fíjate que el C.id=D2.Cuenta también puede quitarte registros esperados en ese filtro

    From ter_auxi_cont_t D

    Left Join ter_auxi_cont_t D2 On (D2.Documento like 'NCI%'+D.Documento) AND C.id=D2.Cuenta , Left Join account C ON C.id = D.Cuenta where D.Transaction_Date between '20160601' and '20170524' And D.Cuenta between '21020202' and '21020202'




    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Saludos. Lima-Perú.


    Muchas gracias por la ayuda, el dia de mañana pruebo y les comento, ya que tenia mis dudas en la forma que estaba utilizando la tabla Account C.

    Les matendre informados.

    Gracias desde ya.

    viernes, 26 de mayo de 2017 3:30
  • De acuerdo, puedes tomar la siguiente consulta para tus pruebas:

    SELECT 
        C.Id,
        C.Description,
        COALESCE(D.Documento, D.Key_Code) AS Documento, 
        COALESCE(D2.Documento, D2.Key_Code) AS NCI, 
        CONVERT (varchar(10), D.Transaction_Date, 103) AS Transaction_Date,
        CONVERT (varchar(10), D2.Transaction_Date, 103) AS Transaction_Date_NCI,
        D.Num_Batch,
        D.Concepto AS Concepto_Doc,
        D2.Concepto AS Concepto_NCI,
        D.Key_Code,
        D.Reference,
        CASE
            WHEN D2.Type = 'DR' THEN D.Valor
            WHEN D2.Type IS NULL THEN D.Dr
        END AS Cargo,
        CASE
            WHEN D.Type = 'CR' THEN D.Valor
            WHEN D.Type IS NULL THEN D.Cr
        END AS Abono
    FROM 
        ter_auxi_cont_t D
        LEFT JOIN ter_auxi_cont_t D2 ON CONCAT('NCI', D.Documento) = D2.Documento
        LEFT JOIN account C ON D.Cuenta = C.id
    WHERE 
        D.Transaction_Date BETWEEN '20160601' AND '20170524'
        AND D.Cuenta BETWEEN '21020202' AND '21020202';
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 26 de mayo de 2017 3:44
  • Hola, muchas gracias por el apoyo.

    Revisando el Query, fíjate que le quite la "," que estaba al final, después eso me da el siguiente error:

    SQL Server Database Error: El identificador formado por varias partes "C.id" no se pudo enlazar.

    A que se deberá?


    viernes, 26 de mayo de 2017 23:04
  • Hola, en este ejemplo:

    Te comparto que únicamente me llama los campos del 'Documento', ahi pone las NCI y los documentos generados, y no me aparecen a la par como inicialmente buscaba e igualmente en el campo 'NCI' todos me aparecen con valor null unicamente.

    Gracias nuevamente por la ayuda.

    viernes, 26 de mayo de 2017 23:11
  • Hola, en este ejemplo:

    Te comparto que únicamente me llama los campos del 'Documento', ahi pone las NCI y los documentos generados, y no me aparecen a la par como inicialmente buscaba e igualmente en el campo 'NCI' todos me aparecen con valor null unicamente.

    Gracias nuevamente por la ayuda.

    Hola, entiendo que con esto te refieres al ejemplo que y te pase y si en efecto esa ultima coma esta demás asi como el alias prueba asi

    From ter_auxi_cont_t D 
    Left  Join ter_auxi_cont_t D2 On (D2.Documento like 'NCI%'+D.Documento) AND D.id=D2.Cuenta 
    Left Join  account C  ON C.id = D.Cuenta
    
    where
    
     D.Transaction_Date between '20160601' and '20170524'
            And D.Cuenta between '21020202' and '21020202'
    en lugar de C la D que ya es  un alias definido el C lo defines en el segundo join es por eso el error, ya lo corregí en mi primer post


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Saludos. Lima-Perú.


    sábado, 27 de mayo de 2017 19:43
  • ...únicamente me llama los campos del 'Documento', ahí pone las NCI y los documentos generados, y no me aparecen a la par como inicialmente buscaba e igualmente en el campo 'NCI' todos me aparecen con valor null.

    ¿Has ejecutado la consulta tal y como yo la he escrito?, de haber realizado cambios, ¿podrías adjuntar la consulta con los cambios realizados?

    No hay ciencia en lo que te propongo, se trata de combinar la misma tabla entendiendo que el segundo conjunto agrega únicamente el literal 'NCI' como prefijo al número de documento, es decir, conjunto a: 100, conjunto b: NCI100, y la expresión de combinación es: NCI100 (concateno NCI a 100) = NCI100, como ves es simple y se espera los resultados adecuados.

    Por otro lado, la expresión: 'COALESCE(D.Documento, D.Key_Code) AS Documento', ¿la columna D.Documento permite NULL a pesar de ser la columna por la que comparas ambos conjuntos?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 27 de mayo de 2017 22:31
  • Deleted
    miércoles, 31 de mayo de 2017 20:09