Principales respuestas
Incluir columna calculada en consulta

Pregunta
-
Hola,
Tenemos la siguiente consulta:SELECT cteD.cCodigoCliente, cteD.cRazonsocial, concD.cNombreConcepto, docto.cFolio, CAST(docto.cFecha AS DATE) AS Fecha, CAST(docto.cFechaVencimiento AS DATE) AS Vencimiento, docto.cTotal, ISNULL((SELECT SUM(a.cImporteCargo) FROM admAsocCargosAbonos a LEFT JOIN admDocumentos d ON d.cIdDocumento = a.cIdDocumentoAbono WHERE a.cIdDocumentoCargo = docto.cIdDocumento AND d.cFecha <= '20190225'),0.0) AS totalPagos FROM admDocumentos docto LEFT JOIN admConceptos concD ON concD.cIdConceptoDocumento = docto.cIdConceptoDocumento LEFT JOIN admClientes cteD ON cteD.cIdClienteProveedor = docto.cIdClienteProveedor WHERE docto.cAfectado = 1 AND docto.cUsaCliente = 1 AND docto.cNaturaleza = 0 AND cteD.cTipoCliente <= 2 AND cteD.CCODIGOCLIENTE = '1460'
que regresa estos resultados:
Aquí se me presenta nuevamente el problema, de que no sé como poder utilizar la columna totalPagos, porque como es una columna calculada, no puedo hacer uso de esa columna en el mismo nivel, necesito en el Where incluir la columna, es decir, algo como Where totalPagos < cTotal para obtener los clientes que tienen documentos pendientes de pago.
Alguna ayuda por favor.
Saludos,
Javier- Editado jparada jueves, 7 de marzo de 2019 17:46
Respuestas
-
Usa una expresión de tabla común (CTE). With R as ( aca tu query ) select * from R where cTotal > totalPagos;
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Marcado como respuesta jparada martes, 11 de junio de 2019 18:50
Todas las respuestas
-
Usa una expresión de tabla común (CTE). With R as ( aca tu query ) select * from R where cTotal > totalPagos;
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Marcado como respuesta jparada martes, 11 de junio de 2019 18:50
-
Hola,
Intentando lo que me comentas,
WITH R AS ( SELECT cteD.cCodigoCliente, cteD.cRazonsocial, concD.cNombreConcepto, docto.cFolio, CAST(docto.cFecha AS DATE) AS Fecha, CAST(docto.cFechaVencimiento AS DATE) AS Vencimiento, docto.cTotal, ISNULL((SELECT SUM(a.cImporteCargo) FROM admAsocCargosAbonos a LEFT JOIN admDocumentos d ON d.cIdDocumento = a.cIdDocumentoAbono WHERE a.cIdDocumentoCargo = docto.cIdDocumento AND d.cFecha <= '20190225'),0.0) AS totalPagos FROM admDocumentos docto LEFT JOIN admConceptos concD ON concD.cIdConceptoDocumento = docto.cIdConceptoDocumento LEFT JOIN admClientes cteD ON cteD.cIdClienteProveedor = docto.cIdClienteProveedor WHERE docto.cAfectado = 1 AND docto.cUsaCliente = 1 AND docto.cNaturaleza = 0 AND cteD.cTipoCliente <= 2 AND cteD.CCODIGOCLIENTE = '1460' ) SELECT * FROM R WHERE cTotal < totalPagos
Me regresa exactamente los mismos resultados que la consulta original, qué estoy haciendo mal?.
Gracias.
Saludos,
Javier
- Editado jparada jueves, 7 de marzo de 2019 18:59
-
La expresión original fue cTotal > totalPagos.
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas -
-
Por lo pronto solo noto en el subquery usado para calcular totalPagos que la condición de cFecha debe moverse al left join o de lo contrario estás cambiando el outer join por inner join.
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas -
Algo así:
WITH CTE AS ( SELECT cteD.cCodigoCliente, cteD.cRazonsocial, concD.cNombreConcepto, docto.cFolio, CAST(docto.cFecha AS DATE) AS Fecha, CAST(docto.cFechaVencimiento AS DATE) AS Vencimiento, docto.cTotal, ISNULL((SELECT SUM(a.cImporteCargo) FROM admAsocCargosAbonos a LEFT JOIN admDocumentos d ON d.cIdDocumento = a.cIdDocumentoAbono AND d.cFecha <= '20190225' WHERE a.cIdDocumentoCargo = docto.cIdDocumento),0.0) AS totalPagos FROM admDocumentos docto LEFT JOIN admConceptos concD ON concD.cIdConceptoDocumento = docto.cIdConceptoDocumento LEFT JOIN admClientes cteD ON cteD.cIdClienteProveedor = docto.cIdClienteProveedor WHERE docto.cAfectado = 1 AND docto.cUsaCliente = 1 AND docto.cNaturaleza = 0 AND cteD.cTipoCliente <= 2 AND cteD.CCODIGOCLIENTE = '1460' ) SELECT * FROM CTE WHERE cTotal > totalPagos
Esto me regresa, lo mismo:
Saludos
- Editado jparada jueves, 7 de marzo de 2019 22:55
-
Por que unes la tabla admAsocCargosAbonos a la tabla admDocumentos dos veces, una por "a.cIdDocumentoCargo = docto.cIdDocumento" y la otra por " d.cIdDocumento = a.cIdDocumentoAbono" esta ultima siendo un outer join?
Esa logica no la sabemos y no podemos reclamar si es correcto o no.
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas -
Hola,
La razón es porque no sé otra forma de obtener tantos los cargos como los abonos de los documentos y la tabla admDocumentos en las columna cIdDocumentoCargo y cIdDocumentoAbono tiene esa información.
Otra detalle que observo es que cualquier otra condición por ejemplo Select * from R where cTotal < 100, funciona, excepto cTotal > totalPagos.
Qué más puedo intentar?.
- Editado jparada viernes, 8 de marzo de 2019 19:45
-
Lo otro que puedes intentar es postear la estructura de las tablas involucradas (solo columnas de interes), data de ejemplo y resultados esperados.
Pudieras intentar hacer dos queries de ejemplos, el uno para traer los cargos de un documento de ejemplo y el otro para traer los abonos. Asi podriamos tener una mejor idea y darte alguna recomendacion.
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas -
La otra opcion...seria crear una funcion tipo tabla de una sola columna, que devuelva un valor por defecto (0) si no encuentra nada.
SELECT cteD.cCodigoCliente, cteD.cRazonsocial, concD.cNombreConcepto, docto.cFolio, CAST(docto.cFecha AS DATE) AS Fecha, CAST(docto.cFechaVencimiento AS DATE) AS Vencimiento, docto.cTotal, d.totalPagos FROM admDocumentos docto LEFT JOIN admConceptos concD ON concD.cIdConceptoDocumento = docto.cIdConceptoDocumento LEFT JOIN admClientes cteD ON cteD.cIdClienteProveedor = docto.cIdClienteProveedor
cross apply dbo.f_total(docto.cIdDocumento,'2019/02/25') as d
WHERE docto.cAfectado = 1 AND docto.cUsaCliente = 1 AND docto.cNaturaleza = 0 AND cteD.cTipoCliente <= 2 AND cteD.CCODIGOCLIENTE = '1460' and d.totalpagos< docto.cTotal
la funcion seria asi:
create funtion [dbo].[f_total] (@cIdDocumento int, @fecha date)
returns @busqueda table(totalpagos int not null)
as
begin
declare @totalpagos int = 0
select @totalpagos = isnull(sum(a.cImporteCargo),0) from admAsocCargosAbonos as a
left join admDocumentos as d on d.cIdDocumento = a.cIdDocumentoAbono
where a.cIdDocumentoCargo =@cIdDocumento and d.cFecha <= @fecha;
insert @busqueda(totalpagos) select @totalpagos;
return;
end;
- Editado Hacerdan lunes, 11 de marzo de 2019 23:16
-
-
Hola,
Quise regresar a esta pregunta para confirmar que la solución propuesta con la CTE es correcta, sólo que para desplegara lo requerido fue necesario utilizar Round...
select * from R where roud(totalfactura,2) > round(totalpagado,2)
Algo que pasé por alto en su momento.
Gracias.
Saludos,
Javier- Editado jparada martes, 11 de junio de 2019 18:52