none
Cartola RRS feed

  • Pregunta

  • Estimados.

    Tengo una variable que contiene el @saldo

    Luego de ello tengo una tabla que contiene debe y haber

    Necesito ir calculando el nuevo saldo registro por registro.

    Ejemplo:

    SET @saldo = 1000

    Id Debe Haber Nuevo_Saldo

    1  500  100      1000 + (500-100) = 1400

    2  200   100      1400+ (200-100) = 1500

    No quiero usar cursores.

    Saludos.


    DBA SQL Server Santiago/Chile

    jueves, 20 de julio de 2017 17:04

Respuestas

  • ¿Hay alguna forma de reconocer la primera operación? es allí donde se debe sumar el saldo anterior:

    DECLARE @NombreTabla table (Id int, Debe int,  Haber int)
    INSERT INTO @NombreTabla VALUES
    (1, 0, 2500000),
    (2, 2500000, 0),
    (3, 0, 2500000);
    
    DECLARE @Saldo int = 508768729
    SELECT
        t1.Id, t1.Debe, t1.Haber,
        SUM((t1.Debe - t1.Haber) + CASE WHEN Id = 1 THEN @Saldo ELSE 0 END) OVER(ORDER BY t1.Id 
    	   ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Saldo
    FROM
        @NombreTabla t1
    ORDER BY t1.Id
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CMAPM jueves, 20 de julio de 2017 18:55
    jueves, 20 de julio de 2017 18:47
  • Es claro que el valor constante '1' debe ser reemplazado por una variable que contenga el identificador de la operación inicial, por ejemplo:

    DECLARE @NombreTabla table (Id int, Debe int,  Haber int);
    INSERT INTO @NombreTabla VALUES
    (1, 0, 2500000), (2, 2500000, 0), (3, 0, 2500000);
    
    DECLARE @Saldo int = 508768729;
    DECLARE @IdMin int = (SELECT MIN(Id) FROM @NombreTabla);
    SELECT
        t1.Id, t1.Debe, t1.Haber, SUM((t1.Debe - t1.Haber) + 
    	   CASE WHEN t1.Id = @IdMin THEN @Saldo ELSE 0 END) OVER(ORDER BY t1.Id 
    		  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Saldo
    FROM
        @NombreTabla t1
    ORDER BY t1.Id;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CMAPM viernes, 21 de julio de 2017 0:24
    jueves, 20 de julio de 2017 19:00

Todas las respuestas

  • Cual version de SQL Server usas?

    Desde la version 2012 contamos con marcos en las funciones de agregacion de ventanas que permiten calcular el saldo corriente.

    select
        id,
        debe,
        haber,
        sum(case when id = B.min_id the @saldo el 0 end + (debe - haber)) over(
        order by id
        rows between unbounding preceding and current row
        ) as nuevo_saldo
    from
        tuTabla cross join (select min(A.id) as min_id from tuTabla as A) as B
    order by -- solo para presentacion
        id;

    Corregido de acuerdo al error de logica expuesto por Willams. El saldo inicial si se tiene en una variable debe ser combinado solo con la primera fila de acuerdo al orden especificado.

    Buena atrapada, Willams!


    AMB

    Some guidelines for posting questions...

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



    jueves, 20 de julio de 2017 17:54
  • Hola.

    Tengo SS2012

    No me esta dando el resultado desde la 2da fila.

    Tengo como saldo inicial 1000

    El resultado que da es:

    La query me suma el saldo inicial + el nuevo saldo, pero no es lo que busco.

    1 0  100 900
    2 100 0 1100
    3 0 100 22

    Debe ser:


    Saludos.


    DBA SQL Server Santiago/Chile





    • Editado CMAPM viernes, 21 de julio de 2017 0:24
    jueves, 20 de julio de 2017 18:21
  • ¿Hay alguna forma de reconocer la primera operación? es allí donde se debe sumar el saldo anterior:

    DECLARE @NombreTabla table (Id int, Debe int,  Haber int)
    INSERT INTO @NombreTabla VALUES
    (1, 0, 2500000),
    (2, 2500000, 0),
    (3, 0, 2500000);
    
    DECLARE @Saldo int = 508768729
    SELECT
        t1.Id, t1.Debe, t1.Haber,
        SUM((t1.Debe - t1.Haber) + CASE WHEN Id = 1 THEN @Saldo ELSE 0 END) OVER(ORDER BY t1.Id 
    	   ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Saldo
    FROM
        @NombreTabla t1
    ORDER BY t1.Id
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CMAPM jueves, 20 de julio de 2017 18:55
    jueves, 20 de julio de 2017 18:47
  • Si, la tabla tiene un campo enumerado

    DBA SQL Server Santiago/Chile

    jueves, 20 de julio de 2017 18:49
  • Me funcionó perfecto.


    DBA SQL Server Santiago/Chile

    jueves, 20 de julio de 2017 18:55
  • Es claro que el valor constante '1' debe ser reemplazado por una variable que contenga el identificador de la operación inicial, por ejemplo:

    DECLARE @NombreTabla table (Id int, Debe int,  Haber int);
    INSERT INTO @NombreTabla VALUES
    (1, 0, 2500000), (2, 2500000, 0), (3, 0, 2500000);
    
    DECLARE @Saldo int = 508768729;
    DECLARE @IdMin int = (SELECT MIN(Id) FROM @NombreTabla);
    SELECT
        t1.Id, t1.Debe, t1.Haber, SUM((t1.Debe - t1.Haber) + 
    	   CASE WHEN t1.Id = @IdMin THEN @Saldo ELSE 0 END) OVER(ORDER BY t1.Id 
    		  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Saldo
    FROM
        @NombreTabla t1
    ORDER BY t1.Id;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta CMAPM viernes, 21 de julio de 2017 0:24
    jueves, 20 de julio de 2017 19:00