我有这张桌子:
Date |StockCode|DaysMovement|OnHand 29-Jul|SC123 |30 |500 28-Jul|SC123 |15 |NULL 27-Jul|SC123 |0 |NULL 26-Jul|SC123 |4 |NULL 25-Jul|SC123 |-2 |NULL 24-Jul|SC123 |0 |NULL
仅第一行具有OnHand值的原因是因为我可以从另一个存储任何股票代码的当前数量的表中获得该值。
该表中的其他记录取自另一个表,该表记录了给定日期的所有移动。
我想更新上表,以便OnHand列基于上一条记录的存量和移动显示该行日期的QtyOnHand,这样在更新结束时看起来像这样:
Date |StockCode|DaysMovement|OnHand 29-Jul|SC123 |30 |500 28-Jul|SC123 |15 |470 27-Jul|SC123 |0 |455 26-Jul|SC123 |4 |455 25-Jul|SC123 |-2 |451 24-Jul|SC123 |0 |453
我目前正在使用CURSOR实现这一目标。但是性能确实吸引了成千上万的记录。
我可以运行一些基于SET的UPDATE语句来实现相同的结果吗?
试试这个( 小提琴演示 )
DECLARE @Movement INT , @OnHandRunning INT ;WITH CTE AS ( SELECT TOP 100 percent DaysMovement, OnHand FROM Table1 ORDER BY [StockCode], [Date] DESC ) UPDATE CTE SET @OnHandRunning = OnHand = COALESCE(@OnHandRunning - @Movement, OnHand), @Movement = DaysMovement
更新: 对于多个StockCodes查询,您可以修改上面的查询,如下所示( Fiddle演示2 ):
StockCodes
DECLARE @Movement INT , @OnHandRunning INT, @StockCode VARCHAR(10) = '' ;WITH CTE AS ( SELECT TOP 100 percent DaysMovement, OnHand, StockCode FROM Table1 ORDER BY [StockCode],[Date] DESC ) UPDATE CTE SET @OnHandRunning = OnHand = CASE WHEN @StockCode<> StockCode THEN OnHand ELSE @OnHandRunning - @Movement END, @Movement = DaysMovement, @StockCode = StockCode