Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 根据另一列中更新的值更新列中的每一行_Sql_Sql Server - Fatal编程技术网

Sql 根据另一列中更新的值更新列中的每一行

Sql 根据另一列中更新的值更新列中的每一行,sql,sql-server,Sql,Sql Server,我有一个名为tblInvManager的表,它有以下列 表名称:tblInvManager InvNo |客户名称| InvAmount | AllInvTotal 1 |客户A | 50000 | 50000 2 |客户A | 15000 | 65000 3 |客户A | 25000 | 90000 4 |客户A | 40000 | 130000 5 |客户B | 10000 | 10000 6 |客户B | 35000 | 45000 7 |客户B | 80000 | 125000 8|Cu

我有一个名为tblInvManager的表,它有以下列

表名称:tblInvManager

InvNo |客户名称| InvAmount | AllInvTotal 1 |客户A | 50000 | 50000
2 |客户A | 15000 | 65000
3 |客户A | 25000 | 90000
4 |客户A | 40000 | 130000
5 |客户B | 10000 | 10000
6 |客户B | 35000 | 45000
7 |客户B | 80000 | 125000
8|Cust C|12000|12000
9 |客户C | 18000 | 30000

例如,如果上表中Invoice Number:1的值从50000更新到25000,我希望根据更改更新AllInvTotal列 因此,更新发票金额后,我的新表如下所示:

预期结果

InvNo |客户名称| InvAmount | AllInvTotal

1 |客户A | 25000 | 25000
2 |客户A | 15000 | 40000
3 |客户A | 25000 | 65000
4 |客户A | 40000 | 105000
5 |客户B | 10000 | 10000
6 |客户B | 35000 | 45000
7 |客户B | 80000 | 125000
8|Cust C|12000|12000
9 |客户C | 18000 | 30000

我提出了以下问题,但我不能这样做。有人能帮我吗

DECLARE @Inv_No VARCHAR(MAX)  
DECLARE @LCRef VARCHAR(MAX)  
DECLARE @InvTotal DECIMAL(18,6)  
DECLARE @AllInvTotal DECIMAL(18,6)  

SET @AllInvTotal = 0  

DECLARE InvManagerCursor CURSOR  
FOR SELECT InvNo_InvMan, LCRef_InvMan, InvAmt_InvMan FROM tblInvManager  
FOR UPDATE OF AllInv_InvMan  
OPEN InvManagerCursor  
FETCH NEXT FROM InvManagerCursor INTO @InvNo, @LCRef, @InvTotal  
WHILE @@FETCH_STATUS = 0  
BEGIN  

SET @AllInvTotal += @InvTotal  

Update tblInvManager   
SET AllInv_InvMan = @AllInvTotal  
WHERE CURRENT OF InvManagerCursor  

FETCH NEXT FROM InvManagerCursor INTO @InvNo, @LCRef, @InvTotal  
END  
CLOSE InvManagerCursor  
DEALLOCATE InvManagerCursor 
我认为您的问题可以通过在特定行中要执行的更新之后执行一个简单的update语句来解决:

UPDATE tblInvManager SET AllInvTotal = (SELECT SUM(InvAmount) FROM 
tblInvManager  AS T WHERE t.Customer_Name = O.Customer_Name and T.InvNo <= O.InvNo) 
FROM tblInvManager  AS O WHERE O.Customer_Name = 'Cust A'
样本数据

预期产出


希望能有所帮助。

现在还不清楚您想在这里做什么。但是您的游标语法不正确。什么是“更新…”????这看起来像是一个运行总数,可以用基于集合的方法而不是RBAR(一行接一行)来完成。。。。你很棒,我的问题解决了。万分感谢
declare @tblInvManager table (
    InvNo INT,
    Customer_Name NVARCHAR(20),
    InvAmount MONEY, 
    AllInvTotal MONEY)

INSERT INTO @tblInvManager VALUES (1,'Cust A ',50000,50000)
INSERT INTO @tblInvManager VALUES (2,'Cust A ',15000,65000)
INSERT INTO @tblInvManager VALUES (3,'Cust A ',25000,90000)
INSERT INTO @tblInvManager VALUES (4,'Cust A ',40000,130000)
INSERT INTO @tblInvManager VALUES (5,'Cust B ',10000,10000)
INSERT INTO @tblInvManager VALUES (6,'Cust B ',35000,45000)
INSERT INTO @tblInvManager VALUES (7,'Cust B ',80000,125000)
INSERT INTO @tblInvManager VALUES (8,'Cust C ',12000,12000)
INSERT INTO @tblInvManager VALUES (9,'Cust C ',18000,30000)

-- Sample Data
SELECT * FROM @tblInvManager

UPDATE @tblInvManager SET InvAmount = 25000 WHERE InvNo = 1
UPDATE @tblInvManager SET AllInvTotal = (SELECT SUM(InvAmount) 
FROM @tblInvManager  AS T WHERE t.Customer_Name = O.Customer_Name and T.InvNo <= O.InvNo) 
FROM @tblInvManager  AS O WHERE O.Customer_Name = 'Cust A'

--Expected Output
SELECT * FROM @tblInvManager