Sql server SQL使用以下行中的值之和更新行
我正试图写一个脚本,将更新一个股票水平的名单,已从两个股票中心合并 我拥有的一段数据Sql server SQL使用以下行中的值之和更新行,sql-server,tsql,Sql Server,Tsql,我正试图写一个脚本,将更新一个股票水平的名单,已从两个股票中心合并 我拥有的一段数据 MovementId ChangeDate StockLevel AdjustmentLevel 1835 2016-01-24 09:48:56 -29 -15 1725 2016-01-22 11:49:31 -138 -10 1715 2016-01-22 11:12:47 -128 -28 170
MovementId ChangeDate StockLevel AdjustmentLevel
1835 2016-01-24 09:48:56 -29 -15
1725 2016-01-22 11:49:31 -138 -10
1715 2016-01-22 11:12:47 -128 -28
1701 2016-01-22 10:48:47 -100 -5
1532 2016-01-20 19:55:28 -14 -14
1520 2016-01-20 18:14:57 -95 -14
1512 2016-01-20 17:55:37 -81 -15
1338 2016-01-19 17:46:22 -66 -7
我正在努力实现
MovementId ChangeDate StockLevel AdjustmentLevel
1835 2016-01-24 09:48:56 -167 -15
1725 2016-01-22 11:49:31 -152 -10
1715 2016-01-22 11:12:47 -142 -28
1701 2016-01-22 10:48:47 -114 -5
1532 2016-01-20 19:55:28 -109 -14
1520 2016-01-20 18:14:57 -95 -14
1512 2016-01-20 17:55:37 -81 -15
1338 2016-01-19 17:46:22 -66 -7
这是我到目前为止得到的
SELECT
movementid,
changedate,
(Lag(stocklevel, 1, 0) OVER (PARTITION BY codeid ORDER BY changedate)) +AdjustmentLevel AS NewStockLevel,
adjustmentlevel,
stocklevel as currentstocklevel
FROM VET_CodeStockMovement_2
where codeid =14877
order by changedate desc
数据库大约有23000行,我需要针对每个不同的代码ID运行完成的脚本 此脚本将有助于更新数据 我创建了一个名为SAMPLETABLE的表
IF OBJECT_ID('SAMPLETABLE') IS NOT NULL
DROP TABLE SAMPLETABLE
GO
Create TABLE SAMPLETABLE
(
MOVEMENTID INT,
CHANGEDATE DATETIME NOT NULL DEFAULT GETDATE(),
STOCKLEVEL DECIMAL(5,2),
ADJUSTMENTLEVEL DECIMAL(5,2)
)
INSERT INTO SAMPLETABLE VALUES(1033,GETDATE(),-14.00,-14.00)
GO
INSERT INTO SAMPLETABLE VALUES(1036,GETDATE(),0,14.00)
GO
INSERT INTO SAMPLETABLE VALUES(1056,GETDATE(),-5.00,-5.00)
GO
INSERT INTO SAMPLETABLE VALUES(1077,GETDATE(),-15.00,10.00)
GO
INSERT INTO SAMPLETABLE VALUES(1205,GETDATE(),-30.00,-15.00)
将您的数据插入原始采样表中
IF OBJECT_ID('SAMPLETABLE') IS NOT NULL
DROP TABLE SAMPLETABLE
GO
Create TABLE SAMPLETABLE
(
MOVEMENTID INT,
CHANGEDATE DATETIME NOT NULL DEFAULT GETDATE(),
STOCKLEVEL DECIMAL(5,2),
ADJUSTMENTLEVEL DECIMAL(5,2)
)
INSERT INTO SAMPLETABLE VALUES(1033,GETDATE(),-14.00,-14.00)
GO
INSERT INTO SAMPLETABLE VALUES(1036,GETDATE(),0,14.00)
GO
INSERT INTO SAMPLETABLE VALUES(1056,GETDATE(),-5.00,-5.00)
GO
INSERT INTO SAMPLETABLE VALUES(1077,GETDATE(),-15.00,10.00)
GO
INSERT INTO SAMPLETABLE VALUES(1205,GETDATE(),-30.00,-15.00)
我创造了诱惑
IF OBJECT_ID('tempdb..##TMPSAMPLETABLE') IS NOT NULL
DROP TABLE ##TMPSAMPLETABLE
GO
创建了新的临时表,因为我一直逐行更新数据。如果你不这样做,那将是错误的总数。创建并插入原始表数据
更新原始数据
此脚本将根据sum Testable更新原始脚本
按movementid调整级别列
删除了可诱惑的
IF OBJECT_ID('tempdb..##TMPSAMPLETABLE') IS NOT NULL
DROP TABLE ##TMPSAMPLETABLE
GO
我找到了一种使用游标来实现所需功能的方法,因为这样就可以运行它来更新所有23000行。虽然它可能需要时间运行,并且不是最方便的资源,但它应该可以实现我需要的功能,而无需手动输入每行的任何数据/写入更新
DECLARE @codeid INT
DECLARE CodeCursor CURSOR FOR (SELECT DISTINCT(CodeId) FROM vet_codestockmovement)
OPEN CodeCursor
FETCH NEXT FROM CodeCursor INTO @codeid
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @movementid INT
DECLARE StockCursor CURSOR FOR (SELECT movementid FROM vet_codestockmovement WHERE codeid =@codeid)
OPEN StockCursor
FETCH NEXT FROM StockCursor INTO @movementid
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @lagvalue INT
SELECT @lagvalue = temp.NewStockLevel FROM (
SELECT (LAG(stocklevel, 1, 0) OVER (PARTITION BY codeid ORDER BY changedate)) + AdjustmentLevel AS NewStockLevel, MovementId
FROM VET_CodeStockMovement
WHERE codeid =@codeid) temp
WHERE temp.MovementId = @movementid
UPDATE dbo.VET_CodeStockMovement SET Stocklevel = @lagvalue WHERE movementid = @movementid
FETCH NEXT FROM StockCursor INTO @movementid
END
CLOSE StockCursor
DEALLOCATE StockCursor
FETCH NEXT FROM CodeCursor INTO @codeid
END
CLOSE CodeCursor
DEALLOCATE CodeCursor
请以文本形式发布当前数据和预期数据。您仍然没有真正指定循环的条件以及哪些记录与哪些记录相关。如果您只有这三项,只需编写三个更新并运行它们,而不是试图使事情复杂化。请以文本格式发送数据!!抱歉,stackoverflow是新手,因此不确定如何格式化!不太明白你是如何到达目的地和你的预期结果的-152这是从哪里来的?感谢您的建议,问题是我有23000行要更新,如果我必须逐行输入数据,这将需要很长时间。请查看我的答案,我相信这将提供更自动化的解决方案。您不能输入任何数据。我创建Originatable是因为我没有包含您的数据的表。您将开始创建诱惑并插入数据创建表##TMPSAMPLETABLE(…)进入##TMPSAMPLETABLE选择。。从您的表格中运行光标脚本,我希望我能帮助您在编写答案时更改问题。问题的第一个版本是不同的