none
Sumar o restar una columna para sacar el saldo sql server RRS feed

  • Pregunta

  • Buenas un cordial saludo.

    quisiera ver si me pueden ayudar estoy tratando de hacer una consulta en sql server, quiero sacar el saldo que tiene cada cliente teniendo en cuenta que cada cliente puede dejar acuenta en diferentes fecha de cada mes.

    La consulta que quiero hacer es cada mes, quiero saber cuantas beses a dejado a cuenta cada cliente y en otra columna que me salga su saldo.

    Esto es lo que tengo asta hoy, sumo todos los acuenta que a dejado el cliente y lo resto al precio 

    select v.Idventa,(cl.Nombre + ' '+cl.Apellido) as Nombre,vd.Fecha,v.Comprobante,v.Serie as Nº,
    v.Precio,
    --///////////////////////////////////////////
    (select sum(dt.Descuento)
    from DetalleVenta dt
    where dt.IdVenta=v.IdVenta) As Descuento,
    --///////////////////////////////////////////
    vd.Acuenta,(v.Precio-(vd.Acuenta*m.Compra))as Saldo
    from Venta v inner join Cliente cl
    on v.IdCliente = cl.IdCliente
    inner join VentaDia vd
    on v.IdVenta = vd.IdVenta
    inner join Moneda m
    on vd.IdMoneda = m.IdMoneda
    where vd.Fecha >='01/01/2020' and vd.Fecha<='31/01/2020'
    go


      Hasi me esta quedando mi columna saldo, por ejemplo el id 20 me muestra el saldo total en cada fecha que dejo acuenta el cliente.

    lo que estoy buscando esque en cada fecha que el cliente deje acuenta me salta el saldo que tengo asta ai, me esplico en esta otra foto

    hasi quisiera que quedara que baya descontado en cada fecha que el cliente baya dondo acuenta.

    aver si me pueden ayudar.

    sábado, 8 de febrero de 2020 6:57

Respuestas

  • Hola Edua9920:

    Sin entrar en como consigues los datos, te voy a plantear una solución.

    Declare @table table
    ([idventa]     int, 
     [fecha]       date, 
     [Comprobante] varchar(100), 
     [Nº]          int, 
     [precio]      decimal(6, 2), 
     [descuento]   decimal(4, 2), 
     [Acuenta]     decimal(4, 2), 
     [saldo]       decimal(7, 2)
    );
    INSERT INTO @table ([idventa], [fecha], [Comprobante], [Nº], [precio], [descuento], [Acuenta],  [saldo])
    VALUES
    (20,'20200121','Boleta' ,2099,211.50,20.00,50.00,161.50),
    (21,'20200121','Factura',9920,130.00,20.00,30.00,161.50),
    (20,'20200125','Boleta' ,2099,211.50,20.00,20.00,161.50),
    (35,'20200127','Boleta' ,2515,200.00,0.00 ,50.00,161.50),
    (36,'20200127','Factura',6363,200.00,0.00 ,50.00,161.50),
    (20,'20200127','Boleta' ,2099,211.50,20.00,20.00,161.50),
    (27,'20200127','Boleta' ,9898,180.00,20.00,50.00,161.50);
    
    select [r].[idventa]
    , [r].[fecha]
    , [r].[Comprobante]
    , [r].[Nº]
    , [r].[precio]
    , [r].[descuento]
    , [r].[Acuenta]
    , [r].[precio] - SUM([r].[Acuenta]) over(partition by [idVenta]
    order by [idVenta] rows unbounded preceding) as [saldo] 
    	from
    		(
    --- Aquí puede ir tú consulta.
    			select * from @table
    --- Esta es la variable de tabla que sustitye a tú consulta.
    		) as r;
     

    He creado una variable de tabla que sustitye a tu query. Esta la encierro entre paréntesis para que sea el origen.

    Y lo único que hace el código, es utilizar la función sum sobre la columna acuenta, utilizando una partición por idVenta. La salida te la puede devolver ordenada por el uso de las funciones de ventana.

    Salida

    Puedes echarle un ojo a este otro link que te puede ayudar con las sumas acumuladas.

    Sumas acumuladas

    https://javifer2.wordpress.com/2019/10/26/sumas-acumuladas/

    Tablas derivadas

    https://javifer2.wordpress.com/2019/11/06/tabla-derivada/

    Otra cosa aparte, veo que utilizas Concat para mostrar el nombre, más el apellido.

    Si utilizas mucho esto, es probable, que te resulte muy rentable disponer de una columna calculada o persistida.

    CREATE TABLE CLIENTE (IDCLIENTE INT, NOMBRE VARCHAR(20), APELLIDO VARCHAR(20)) GO INSERT INTO CLIENTE (IDCLIENTE, NOMBRE, APELLIDO) VALUES (1,'ANA','PEREZ'), (2,'BEA','SOLIS'); GO /* Hasta aquí es el escenario que tú tienes (una tabla con una serie de columnas y registros insertados )*/ GO ALTER TABLE CLIENTE ADD NOMBRECOMPLETO AS CONCAT(NOMBRE,' ', APELLIDO); GO SELECT C.IDCLIENTE, C.NOMBRE, C.APELLIDO, C.NOMBRECOMPLETO

    FROM CLIENTE C

    SQL Server Computed

    https://docs.microsoft.com/es-es/sql/relational-databases/tables/specify-computed-columns-in-a-table?view=sql-server-ver15


    • Marcado como respuesta Edua9920 sábado, 8 de febrero de 2020 13:38
    sábado, 8 de febrero de 2020 7:56

Todas las respuestas

  • Hola Edua9920:

    Sin entrar en como consigues los datos, te voy a plantear una solución.

    Declare @table table
    ([idventa]     int, 
     [fecha]       date, 
     [Comprobante] varchar(100), 
     [Nº]          int, 
     [precio]      decimal(6, 2), 
     [descuento]   decimal(4, 2), 
     [Acuenta]     decimal(4, 2), 
     [saldo]       decimal(7, 2)
    );
    INSERT INTO @table ([idventa], [fecha], [Comprobante], [Nº], [precio], [descuento], [Acuenta],  [saldo])
    VALUES
    (20,'20200121','Boleta' ,2099,211.50,20.00,50.00,161.50),
    (21,'20200121','Factura',9920,130.00,20.00,30.00,161.50),
    (20,'20200125','Boleta' ,2099,211.50,20.00,20.00,161.50),
    (35,'20200127','Boleta' ,2515,200.00,0.00 ,50.00,161.50),
    (36,'20200127','Factura',6363,200.00,0.00 ,50.00,161.50),
    (20,'20200127','Boleta' ,2099,211.50,20.00,20.00,161.50),
    (27,'20200127','Boleta' ,9898,180.00,20.00,50.00,161.50);
    
    select [r].[idventa]
    , [r].[fecha]
    , [r].[Comprobante]
    , [r].[Nº]
    , [r].[precio]
    , [r].[descuento]
    , [r].[Acuenta]
    , [r].[precio] - SUM([r].[Acuenta]) over(partition by [idVenta]
    order by [idVenta] rows unbounded preceding) as [saldo] 
    	from
    		(
    --- Aquí puede ir tú consulta.
    			select * from @table
    --- Esta es la variable de tabla que sustitye a tú consulta.
    		) as r;
     

    He creado una variable de tabla que sustitye a tu query. Esta la encierro entre paréntesis para que sea el origen.

    Y lo único que hace el código, es utilizar la función sum sobre la columna acuenta, utilizando una partición por idVenta. La salida te la puede devolver ordenada por el uso de las funciones de ventana.

    Salida

    Puedes echarle un ojo a este otro link que te puede ayudar con las sumas acumuladas.

    Sumas acumuladas

    https://javifer2.wordpress.com/2019/10/26/sumas-acumuladas/

    Tablas derivadas

    https://javifer2.wordpress.com/2019/11/06/tabla-derivada/

    Otra cosa aparte, veo que utilizas Concat para mostrar el nombre, más el apellido.

    Si utilizas mucho esto, es probable, que te resulte muy rentable disponer de una columna calculada o persistida.

    CREATE TABLE CLIENTE (IDCLIENTE INT, NOMBRE VARCHAR(20), APELLIDO VARCHAR(20)) GO INSERT INTO CLIENTE (IDCLIENTE, NOMBRE, APELLIDO) VALUES (1,'ANA','PEREZ'), (2,'BEA','SOLIS'); GO /* Hasta aquí es el escenario que tú tienes (una tabla con una serie de columnas y registros insertados )*/ GO ALTER TABLE CLIENTE ADD NOMBRECOMPLETO AS CONCAT(NOMBRE,' ', APELLIDO); GO SELECT C.IDCLIENTE, C.NOMBRE, C.APELLIDO, C.NOMBRECOMPLETO

    FROM CLIENTE C

    SQL Server Computed

    https://docs.microsoft.com/es-es/sql/relational-databases/tables/specify-computed-columns-in-a-table?view=sql-server-ver15


    • Marcado como respuesta Edua9920 sábado, 8 de febrero de 2020 13:38
    sábado, 8 de febrero de 2020 7:56
  • muchísimas  gracias es exactamente lo que estaba tratado de hacer;

    Gracias un saludo:

     
    sábado, 8 de febrero de 2020 13:41
  • una pregunta me encontré un inconveniente:

    la consulta me funciona perfecta mente. Tengo el caso que un cliente no termina de pagar en un mes y al otro mes sigue dando acuenta, como yo hago la consulta cada mes,

    solo me sale el saldo del mes que consulto, tiene anuente que puede a ver en los meses anteriores mas cuenta

    me explico:

    asta aquí todo bien.

    pero si yo hago la consulta del siguiente mes ai tengo el inconveniente

    

    no me esta tomando en cuenta que el anterior mes tengo acuenta y solo me esta rentando el acuenta del mes que consulto 

    sábado, 8 de febrero de 2020 19:34