Я не вижу способа сделать это, как я предпочитаю - на основе набора.
Вы всегда можете прибегнуть к курсору - он не совсем высокопроизводительный или что-то в этом роде, но он работает,Если это всего лишь один раз, тогда ты в порядке.Если вам нужно делать это часто, вы можете продолжить поиск лучшего решения:
-- declare a table variable for testing
DECLARE @sample TABLE (Num INT PRIMARY KEY, ProductName VARCHAR(50), Cost INT, ProdType VARCHAR(10), Total INT)
-- insert some data
INSERT INTO @sample VALUES
(1, 'ProductX', 3, 'Checker', NULL),
(2, 'Product0', 5, 'TOY', NULL),
(3, 'Product1', 5, 'TOY', NULL),
(4, 'Product2', 8, 'TOY', NULL),
(5, 'ProductZ', 10, 'Checker', NULL),
(6, 'Product3', 5, 'TOY', NULL),
(7, 'Product4', 9, 'TOY', NULL),
(8, 'Product5', 18, 'TOY', NULL),
(9, 'Product6', 25, 'TOY', NULL),
(10, 'ProductY', 15, 'Checker', NULL),
(11, 'Product7', 15, 'TOY', NULL),
(12, 'Product8', 12, 'TOY', NULL),
(13, 'Product9', 5, 'TOY', NULL)
-- declare the cursor, specify that we want to UDPATE the Total column
DECLARE SampleCursor CURSOR KEYSET FOR
SELECT Cost, Prodtype
FROM @sample
ORDER BY Num
FOR UPDATE OF Total
-- declare and initialize variables
DECLARE @Cost INT, @LastCheckerCost INT, @ProdType VARCHAR(10)
SET @LastCheckerCost = 0
-- open cursor and iterate over data set
OPEN SampleCursor
FETCH NEXT FROM SampleCursor INTO @Cost, @ProdType
-- while we have data......
WHILE @@FETCH_STATUS = 0
BEGIN
-- if we have a "Checker" row -> remember that value for later
IF @ProdType = 'Checker'
SET @LastCheckerCost = @Cost
ELSE
-- if we have a "normal" row, update the Total column
UPDATE @sample
SET Total = @LastCheckerCost + @Cost
WHERE CURRENT OF SampleCursor
-- get next set of data
FETCH NEXT FROM SampleCursor INTO @Cost, @ProdType
END
-- close and clean up cursor
CLOSE SampleCursor
DEALLOCATE SampleCursor
-- inspect results
SELECT * FROM @Sample