none
Incluir columna calculada en consulta RRS feed

  • 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
    jueves, 7 de marzo de 2019 17:46

Respuestas

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
    jueves, 7 de marzo de 2019 18:20
  • 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
    jueves, 7 de marzo de 2019 18:58
  • Ya lo había intentado con esa expresión y el resultado es exactamente el mismo que menciono, alguna otra idea.

    Gracias.

    • Editado jparada jueves, 7 de marzo de 2019 20:19
    jueves, 7 de marzo de 2019 20:19
  • 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

    jueves, 7 de marzo de 2019 20:27
  • 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
    jueves, 7 de marzo de 2019 22:54
  • 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

    viernes, 8 de marzo de 2019 12:44
  • 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
    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

    viernes, 8 de marzo de 2019 19:51
  • 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
    lunes, 11 de marzo de 2019 22:56
  • Hola,

    Agradezco sus respuesta, no me fue posible resolver por query, temporalmente lo estoy haciendo por programación.

    Gracias por su ayuda.

    Saludos,
    Javier
    • Editado jparada martes, 19 de marzo de 2019 19:52
    martes, 19 de marzo de 2019 19:52
  • 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
    martes, 11 de junio de 2019 18:52