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

时间:2018-01-03 19:29:17

标签: sql sql-server

我有一个名为tblInvManager的表,其中包含以下列

表名:tblInvManager

InvNo |客户名称| InvAmount | AllInvTotal 1 |客户A | 50,000 | 50000个
2 |客户A | 15,000 | 65000个
3 |客户A | 25,000 | 90000个
4 |客户A | 40,000 | 130000个
5 |客户B | 10,000 |万个
6 |客户B | 35,000 | 45000个
7 |客户B | 80,000 | 125000个
8 | Cust C | 12,000 | 12000个
9 | Cust C | 18,000 | 30,000

例如,如果上表中的Invoice Number:1的值从50,000更新为25,000,我想根据更改更新AllInvTotal列 所以在更新发票金额后我的新表将如下:

预期结果

InvNo |客户名称| InvAmount | AllInvTotal

1 |客户A | 25,000 | 25000个
2 |客户A | 15,000 | 40000个
3 |客户A | 25,000 | 65000个
4 |客户A | 40,000 | 105000个
5 |客户B | 10,000 |万个
6 |客户B | 35,000 | 45000个
7 |客户B | 80,000 | 125000个
8 | Cust C | 12,000 | 12000个
9 | Cust C | 18,000 | 30,000

我已经进行了以下查询,但我无法这样做。 Someome请帮助我:

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 

1 个答案:

答案 0 :(得分:0)

认为您可以通过在特定行中进行更新后执行的简单更新语句来解决您的问题:

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'

这会为AllInvTotalCustomer Name的其他行更新Cust A列。

以下测试代码返回了您提供的样本数据的预期输出:

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 

示例数据

enter image description here

预期输出

enter image description here

希望它有所帮助。