Как обновить данные предыдущей строки в SQL SERVER
Например, таблица продаж
SlNo Inventorycode Cost Date
1. 100001 1.8 01/01/2017
2. 100002 2.3 01/01/2017
3. 100002 3.5 02/01/2017
4. 100001 2.5 03/01/2017
Стол со склада
SlNO InventoryCode Cost Date
1. 100001 01/01/2017
2. 100002 01/01/2017
3. 100001 01/01/2017
4. 100002 02/01/2017
5. 100001 01/01/2017
6. 100002 03/01/2017
Исходя из вышеприведенных данных, я хочу обновить COST Salestable до запасов для концерна ItemCode и date. Если в дату беспокойства не было продаж, я хочу обновить (StockTable) стоимость стоимости предыдущей даты.
3 ответа
Решение
Вы пытаетесь сделать это:
DECLARE @Sales TABLE
(
[SLNo] TINYINT
,[Inventorycode] INT
,[Cost] DECIMAL(9,1)
,[Date] DATE
);
DECLARE @Stock TABLE
(
[SLNo] TINYINT
,[Inventorycode] INT
,[Cost] DECIMAL(9,1)
,[Date] DATE
);
INSERT INTO @Sales ([SLNo], [Inventorycode], [Cost], [Date])
VALUES (1, 100001, 1.8, '01/01/2017')
,(2, 100002, 2.3, '01/01/2017')
,(3, 100002, 3.5, '02/01/2017')
,(4, 100001, 2.5, '03/01/2017');
INSERT INTO @Stock ([SLNo], [Inventorycode], [Date])
VALUES (1, 100001, '01/01/2017')
,(2, 100002, '01/01/2017')
,(3, 100001, '01/01/2017')
,(4, 100002, '02/01/2017')
,(5, 100001, '01/01/2017')
,(6, 100002, '03/01/2017');
UPDATE @Stock
SET [Cost] = DS.[Cost]
FROM @Stock A
OUTER APPLY
(
SELECT TOP 1 B.[Cost]
FROM @Sales B
WHERE B.[Inventorycode] = A.[Inventorycode]
AND B.[Date] <= A.[Date]
ORDER BY B.[Date] DESC
) DS;
SELECT *
FROM @Stock;
Я не проверял это, но это должно работать
UPDATE stocktable
SET Cost = (
SELECT TOP 1 Cost
FROM SalesTable st
WHERE st.Inventorycode = StockTable.Inventorycode
AND st.DATE <= StockTable.DATE
ORDER BY DATE DESC
)
FROM StockTable
Было бы неплохо, если бы вы могли поделиться схемой и данными для быстрого тестирования
update st set cost = sl.cost from stock_table st
inner join sales_table sl on sl.Inventory_Code=st.Inventory_Code
and sl.Date = st.Date