2015-12-08 2 views
0

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

enter image description here

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

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 

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

enter image description here

+3

НЕ использовать рекурсивную функцию, как это. Нет необходимости создавать функцию для вычисления общей суммы. Какую версию SQL Server вы используете? Лучший подход значительно варьируется в зависимости от того, находитесь ли вы на 2012+ или раньше. –

+0

SQL Server 2014 –

+2

Возможный дубликат [Рассчитать текущий общий/текущий баланс] (http://stackoverflow.com/questions/11310877/calculate-running-total-running-balance) – AHiggins

ответ

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 
+0

Я очень благодарен за ваш добрый ответ, но моя проблема в том, что я хочу вычислить значение столбца во время ввода строки. –

Смежные вопросы