Home Forums SQL Server 2008 T-SQL (SS2K8) Running Remaining Balance or Running Subtraction - Partition By Account RE: Running Remaining Balance or Running Subtraction - Partition By Account

  • Hi Jeff,

    I have modified the original script. Here's the entire script (DDL + Cursor Script)

    IF OBJECT_ID (N'dbo.Account_Tagging', N'U') IS NOT NULL

    AND EXISTS(SELECT * from dbo.Account_Tagging)

    drop table Account_Tagging

    BEGIN

    CREATE TABLE Account_Tagging(

    Account VARCHAR(17) NOT NULL

    ,Budget_Remaining INTEGER NOT NULL

    ,Amount NUMERIC(7,2) NOT NULL

    ,Budget_To_Tag BIT NOT NULL

    ,RN INTEGER NOT NULL

    );

    INSERT INTO Account_Tagging(Account,Budget_Remaining,Amount,Budget_To_Tag,RN) VALUES ('10-60001-600-65-0',5124,2500,0,1);

    INSERT INTO Account_Tagging(Account,Budget_Remaining,Amount,Budget_To_Tag,RN) VALUES ('10-60001-603-69-0',12992,3100,0,1);

    INSERT INTO Account_Tagging(Account,Budget_Remaining,Amount,Budget_To_Tag,RN) VALUES ('10-60001-603-69-0',0,2750,0,2);

    INSERT INTO Account_Tagging(Account,Budget_Remaining,Amount,Budget_To_Tag,RN) VALUES ('10-60001-603-69-0',0,1000,0,3);

    INSERT INTO Account_Tagging(Account,Budget_Remaining,Amount,Budget_To_Tag,RN) VALUES ('10-60001-604-65-0',617,700,0,1);

    INSERT INTO Account_Tagging(Account,Budget_Remaining,Amount,Budget_To_Tag,RN) VALUES ('10-60001-604-69-0',3604,425,0,1);

    INSERT INTO Account_Tagging(Account,Budget_Remaining,Amount,Budget_To_Tag,RN) VALUES ('10-60001-605-65-0',1182,1006.25,0,1);

    INSERT INTO Account_Tagging(Account,Budget_Remaining,Amount,Budget_To_Tag,RN) VALUES ('10-60001-605-65-0',0,758,0,2);

    INSERT INTO Account_Tagging(Account,Budget_Remaining,Amount,Budget_To_Tag,RN) VALUES ('10-60001-605-65-0',0,695,0,3);

    END

    BEGIN

    CREATE TABLE #x

    (

    Account varchar(20),

    Budget_Remaining float,

    Amount float,

    RunningBalance float,

    Budget_To_Tag float,

    RN varchar(20)

    );

    INSERT #x(Account,Budget_Remaining,Amount,RunningBalance,Budget_To_Tag,RN)

    SELECT Account,Budget_Remaining,Amount, 0 RunningBalance,Budget_To_Tag,RN

    FROM Account_Tagging

    ORDER BY Account,RN;

    DECLARE @account varchar(20), @Budget_Remaining float,@Amount float,@RunningBalance float,

    @Budget_To_Tag float,@RN varchar(20);

    --SET @RunningBalance = 0;

    DECLARE c CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY

    FOR SELECT Account,Budget_Remaining,Amount,0 RunningBalance,Budget_To_Tag, RN FROM #x

    ORDER BY Account,RN;

    OPEN c;

    FETCH c INTO @account,@Budget_Remaining, @Amount, @RunningBalance , @Budget_To_Tag, @RN;

    WHILE @@FETCH_STATUS = 0

    BEGIN

    --IF @RN = 1

    --SET @RunningBalance = @Budget_Remaining;

    --ELSE

    SET @RunningBalance = @Budget_Remaining - @Amount;

    UPDATE #x SET Budget_Remaining = @RunningBalance WHERE Account = @account and @RN + 1 = RN;

    UPDATE #x SET RunningBalance = @RunningBalance WHERE Account = @account and @RN = RN;

    FETCH c INTO @account,@Budget_Remaining, @Amount, @RunningBalance , @Budget_To_Tag, @RN;

    END

    CLOSE c; DEALLOCATE c;

    UPDATE #x

    SET Budget_To_Tag = RunningBalance

    WHERE RunningBalance > Amount

    select * from Account_Tagging

    select * from #X

    drop table #X

    END