none
Consulta SQL RRS feed

  • Pregunta

  • Buenos dias, tengo la siguiente consulta:

    DECLARE @Saldo Decimal(10,2);SELECT * FROM (
    SELECT v.idVenta AS Nª, v.Fecha, (c.RazonSocial) AS Cliente,
    v.Cantidad,
    v.Total,  
    IIF( DATEDIFF(DAY, IIF(p.Fecha IS NULL,v.Fecha, p.Fecha),GETDATE()) > 10, (ISNULL(v.Total,0) - ISNULL(SUM(p.Monto),0))  + (ISNULL(v.Total,0) - ISNULL(SUM(p.Monto),0))  * Convert(decimal(10,3),((DATEDIFF(DAY, IIF(p.Fecha IS NULL,v.Fecha, p.Fecha),GETDATE()) *0.3)/100)), (ISNULL(v.Total,0) - ISNULL(SUM(p.Monto),0))) AS Saldo,
    ISNULL(SUM(p.Monto),0) AS Pagado,
    v.idCliente  , IIF(p.Fecha IS NULL,v.Fecha, p.Fecha)  'FechaPago',  
    DATEDIFF(DAY, IIF(p.Fecha IS NULL,v.Fecha, p.Fecha),GETDATE()) 'Dias'
    from ventas v
    INNER JOIN clientes c ON c.idCliente = v.idCliente    
    LEFT JOIn ventas_pagos p On p.idVenta = v.idVenta  
    GROUP BY v.idVenta, v.Fecha,c.RazonSocial, v.Cantidad,v.Total, v.idCliente , p.Fecha)
    AS Aux Where Aux.Saldo<>0  
    AND idCliente ='4015'
    ORDER BY Fecha


    Que me arroja el siguiente resultado:


    Nª    Fecha                     Cliente    Cantidad    Total    Saldo    Pagado           Dias
    35    2020-08-31 19:05   xx                   6    5968.22    3243.24    2968.00      27
    35    2020-08-31 19:05    xx                  6    5968.22    3181.70    3000.22       24

    Pero yo quiero que solamente me aparezca el ultimo, por venta que solamente me filtre el ultimo pago para comparar

    IIF(p.Fecha IS NULL,v.Fecha,  p.Fecha)  'FechaPago' en ese item no podria usar una funcion LAST?

    Saludos

    martes, 29 de septiembre de 2020 11:58

Todas las respuestas

  • Hola Mauricio Hamak:

    Last no es una función válida en Sql Server:

    DECLARE @SALDO Decimal(10, 2);
    
    SELECT *
    	   FROM (
    			  SELECT v.idVenta AS Nª
    				   , v.Fecha
    				   , c.RazonSocial AS Cliente
    				   , v.Cantidad
    				   , v.Total
    				   , IIF(DATEDIFF(DAY, IIF(p.Fecha IS NULL, v.Fecha, p.Fecha), GETDATE()) > 10, ISNULL(v.Total, 0) - ISNULL(SUM(p.Monto), 0) + (ISNULL(v.Total, 0) - ISNULL(SUM(p.Monto), 0)) * Convert(decimal(10, 3), ((DATEDIFF(DAY, IIF(p.Fecha IS NULL, v.Fecha, p.Fecha), GETDATE()) * 0.3) / 100)), ISNULL(v.Total, 0) - ISNULL(SUM(p.Monto), 0)) AS Saldo
    				   , ISNULL(SUM(p.Monto), 0) AS Pagado
    				   , v.idCliente
    				   , IIF(p.Fecha IS NULL, v.Fecha, p.Fecha) AS 'FechaPago'
    				   , DATEDIFF(DAY, IIF(p.Fecha IS NULL, v.Fecha, p.Fecha), GETDATE()) AS 'Dias'
    					 from ventas AS v
    							   INNER JOIN clientes AS c ON c.idCliente = v.idCliente
    							   Outer apply (
    							   SELECT TOP(1) fecha, monto,  from ventas_pagos vp
    									where vp.idVenta = v.idVenta 
    							   order by fecha desc
    							   ) p
    							   
    					 GROUP BY v.idVenta
    							, v.Fecha
    							, c.RazonSocial
    							, v.Cantidad
    							, v.Total
    							, v.idCliente
    							, p.Fecha
    			) AS Aux
    	   Where Aux.Saldo <> 0 AND idCliente = '4015'
    	   ORDER BY Fecha;

    Una opción válida es utilizar en vez de LEFT JOIN el operador Apply (OUTER APPLY), para el conjunto.

    La particularidad es que hay que reseñar en el conjunto interior la union con el conjunto exterior.

    Y en el puedes utilizar el operador TOP con un order by 


    martes, 29 de septiembre de 2020 13:52