none
Consulta RRS feed

  • Pregunta

  • Buenos dias, tengo la siguiente consulta:

    SELECT (pv.PuntoVenta + ' - ' + (CAST(RIGHT('00000000' + convert(varchar,v.idVenta),8 ) as varchar(100)))) AS Numero,
    v.Fecha, pv.Nombre AS Tipo,
    c.RazonSocial AS Cliente, 
    ISNULL((v.Total),0) AS Total,
     ISNULL((v.Total - v.Pago),0) AS Debe,
     '0.00' AS Haber, 
    (v.Total - SUM(p.Monto)) AS Saldo
    FROM ventas v
    INNER JOIN ventas_pagos p ON p.idVenta = v.idVenta
    INNER JOIN clientes c ON c.idCliente = v.idCliente
    INNER JOIN puntoVenta pv ON pv.idPuntoVenta = v.idPuntoVenta
    WHERE c.idCliente =22
    GROUP BY c.RazonSocial, v.Fecha, pv.PuntoVenta, v.CF,pv.Nombre,v.idVenta,v.Total,v.Pago

    Que me devuelve los siguientes resultados:

    La pregunta es: Como hago para que el saldo me vaya sumando acorde lo que devuelve la fila anterior?

    Por ejemplo en la fila dos en saldo que me devuelva 685.80 + 216.00.

    Saludos

    miércoles, 17 de mayo de 2017 10:25

Respuestas

  • Cual version de SQL Server usas?

    En la version 2012 se mejoro la clausula OVER y ahora contamos con funciones de agregacion de ventanas con marco de referencia.

    Sin saber como particionas (saldo por punto de venta o cliente), seria algo asi como:

    SELECT
        (pv.PuntoVenta + ' - '
        + (CAST(RIGHT('00000000' + CONVERT(varchar, v.idVenta), 8) AS varchar(100)))) AS Numero,
        v.Fecha,
        pv.Nombre AS Tipo,
        c.RazonSocial AS Cliente,
        ISNULL((v.Total), 0) AS Total,
        ISNULL((v.Total - v.Pago), 0) AS Debe,
        '0.00' AS Haber,
        SUM((v.Total - SUM(p.Monto))) OVER(
    	PARTITION BY pv.PuntoVenta 
    	ORDER BY v.Fecha, v.idVenta
    	ROWS UNBOUNDED PRECEDING
    	)AS Saldo
    FROM
        ventas AS v
        INNER JOIN ventas_pagos AS p
        ON p.idVenta = v.idVenta
        INNER JOIN clientes AS c
        ON c.idCliente = v.idCliente
        INNER JOIN puntoVenta AS pv
        ON pv.idPuntoVenta = v.idPuntoVenta
    WHERE
        c.idCliente = 22
    GROUP BY
        c.RazonSocial,
        v.Fecha,
        pv.PuntoVenta,
        v.CF,
        pv.Nombre,
        v.idVenta,
        v.Total,
        v.Pago;

    La particion da la agrupacion donde calculas el saldo, el ordenamiento indica en que orden procesar la transaccion y el marco (ROWS BETWEEN) indican el comienzo y final del marco dentro de la particion donde se llevara el calculo para una fila dada.

    Chequea los BOL para mas informacion sobre el tema.

    https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    • Editado HunchbackMVP miércoles, 17 de mayo de 2017 12:26
    • Marcado como respuesta Mauricio Hamak miércoles, 17 de mayo de 2017 12:44
    miércoles, 17 de mayo de 2017 12:25