Я пытаюсь избежать использования цикла для получения промежуточного итога. Это упрощенная версия;реальная версия включает промежуточные итоги по нескольким категориям. Я знаю, что могу сделать это, используя оконную функцию [@ Xata2], но я не могу придумать, как сделать это без цикла, если вы ограничите итоговое значение неотрицательным (т. Е. Если оно отрицательное, используйте 0вместо этого) [@ Xata3], потому что любые условия, которые я ставлю, относятся к текущей строке, а не кумулятивному итогу.
DECLARE @Xata TABLE (
ID INTEGER IDENTITY
, result INTEGER
)
DECLARE @Xata2 TABLE (
ID INTEGER IDENTITY
, result INTEGER
, total INTEGER
)
DECLARE @Xata3 TABLE (
ID INTEGER IDENTITY
, result INTEGER
, total INTEGER
)
DECLARE @result INTEGER
, @total INTEGER
, @Counter INTEGER
INSERT INTO @Xata (result) SELECT ROUND(RAND()* 9 - 4.5, 0)
INSERT INTO @Xata (result) SELECT ROUND(RAND()* 9 - 4.5, 0)
INSERT INTO @Xata (result) SELECT ROUND(RAND()* 9 - 4.5, 0)
INSERT INTO @Xata (result) SELECT ROUND(RAND()* 9 - 4.5, 0)
INSERT INTO @Xata (result) SELECT ROUND(RAND()* 9 - 4.5, 0)
INSERT INTO @Xata (result) SELECT ROUND(RAND()* 9 - 4.5, 0)
INSERT INTO @Xata (result) SELECT ROUND(RAND()* 9 - 4.5, 0)
INSERT INTO @Xata (result) SELECT ROUND(RAND()* 9 - 4.5, 0)
INSERT INTO @Xata (result) SELECT ROUND(RAND()* 9 - 4.5, 0)
INSERT INTO @Xata (result) SELECT ROUND(RAND()* 9 - 4.5, 0)
-- @Xata2: WINDOWING FUNCTION
INSERT INTO @Xata2
SELECT result
, SUM(result) OVER (ORDER BY ID)
FROM @Xata
SELECT ID
, result
, total AS total_x2_neg
FROM @Xata2
SET @Counter = 0
WHILE @Counter < (SELECT MAX(ID) FROM @Xata)
BEGIN
SET @Counter += 1
SELECT @result = result FROM @Xata WHERE ID = @Counter
SET @total = ISNULL((SELECT total FROM @Xata3 WHERE ID = @Counter - 1), 0)
INSERT INTO @Xata3
SELECT @result
, IIF(@result + @total < 0, 0, @result + @total)
END
SELECT ID
, result
, total AS total_x3_noneg
FROM @Xata3