Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL使用以下行中的值之和更新行_Sql Server_Tsql - Fatal编程技术网

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选择。。从您的表格中运行光标脚本,我希望我能帮助您在编写答案时更改问题。问题的第一个版本是不同的