Principales respuestas
Left Join no esta llamando todos los campos

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'
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.- Propuesto como respuesta Joyce_ACModerator lunes, 29 de mayo de 2017 16:29
- Marcado como respuesta Joyce_ACModerator lunes, 5 de junio de 2017 14:10
-
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ú.
- Editado Augusto1982 sábado, 27 de mayo de 2017 19:44
- Propuesto como respuesta Joyce_ACModerator lunes, 29 de mayo de 2017 16:29
- Marcado como respuesta Joyce_ACModerator lunes, 5 de junio de 2017 14:10
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
-
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?
-
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.
-
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.
-
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. -
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á?
-
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, 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ú.
- Editado Augusto1982 sábado, 27 de mayo de 2017 19:44
- Propuesto como respuesta Joyce_ACModerator lunes, 29 de mayo de 2017 16:29
- Marcado como respuesta Joyce_ACModerator lunes, 5 de junio de 2017 14:10
-
...ú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.- Propuesto como respuesta Joyce_ACModerator lunes, 29 de mayo de 2017 16:29
- Marcado como respuesta Joyce_ACModerator lunes, 5 de junio de 2017 14:10
-