Функция для вычисления текущего баланса столбца при вставке строки

Как я могу написать функцию для вычисления значения столбца, как описано на этом рисунке?

Это код, который я пробовал:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION RunningBal
(
    -- Add the parameters for the function here
    @Dr INT,
    @Cr INT,
    @Code NVARCHAR(5)
)
RETURNS INT
AS
BEGIN
    -- Declare the return variable here
    DECLARE @CurrentRunningBal INT

    -- Add the T-SQL statements to compute the return value here
    DECLARE @PreviouBal INT

    SET @PreviouBal = (SELECT TOP(1) [RunningBal] FROM Test WHERE Code = @Code ORDER BY ID DESC)

    if(@PreviouBal IS NULL)
     SET @PreviouBal = 0

    SET @CurrentRunningBal = @PreviouBal + @Dr - @Cr

    -- Return the result of the function
    RETURN @CurrentRunningBal

END
GO

Когда я пытаюсь выполнить это, я получаю следующую ошибку и понятия не имею, как ее решить.

1 ответ

Решение

Скорее всего, проблема в том, что имя вашего столбца точно совпадает с именем функции RunningBalОднако я не могу воспроизвести свое поведение. В Sql Server 2014 Вы можете использовать оконную функцию для подведения итогов, например:

DECLARE @t TABLE
    (
      id INT ,
      code CHAR(1) ,
      dramount MONEY ,
      cramount MONEY
    )
INSERT  INTO @t
VALUES  ( 1, 'a', 200, 0 ),
        ( 2, 'a', 250, 0 ),
        ( 3, 'b', 300, 0 ),
        ( 4, 'b', 0, 150 ),
        ( 5, 'a', 300, 0 ),
        ( 6, 'a', 100, 0 )


SELECT  * ,
        SUM(dramount - cramount) OVER ( PARTITION BY code ORDER BY id ) AS runningTotal
FROM    @t
ORDER BY id

Выход:

id  code    dramount    cramount    runningTotal
1   a       200.00      0.00        200.00
2   a       250.00      0.00        450.00
3   b       300.00      0.00        300.00
4   b       0.00        150.00      150.00
5   a       300.00      0.00        750.00
6   a       100.00      0.00        850.00
Другие вопросы по тегам