Sql 根据另一列中更新的值更新列中的每一行
我有一个名为tblInvManager的表,它有以下列 表名称:tblInvManager InvNo |客户名称| InvAmount | AllInvTotal 1 |客户A | 50000 | 50000Sql 根据另一列中更新的值更新列中的每一行,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
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