如何更新运行余额列

时间:2018-01-02 20:03:48

标签: c# sql-server

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

表名:tblInvManager

InvNo | Customer Name | InvAmount   | AllInvTotal
1     |    Cust A     |    50,000   |     50,000    
2     |    Cust A     |    15,000   |     65,000    
3     |    Cust A     |    25,000   |     90,000    
4     |    Cust A     |    40,000   |    130,000    
5     |    Cust B     |    10,000   |     10,000        
6     |    Cust B     |    35,000   |     45,000        
7     |    Cust B     |    80,000   |    125,000        
8     |    Cust C     |    12,000   |     12,000        
9     |    Cust C     |    18,000   |     30,000        

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

预期结果

InvNo | Customer Name | InvAmount   | AllInvTotal
1     |    Cust A     |    25,000   |     25,000    
2     |    Cust A     |    15,000   |     40,000    
3     |    Cust A     |    25,000   |     65,000    
4     |    Cust A     |    40,000   |    105,000    
5     |    Cust B     |    10,000   |     10,000        
6     |    Cust B     |    35,000   |     45,000        
7     |    Cust B     |    80,000   |    125,000        
8     |    Cust C     |    12,000   |     12,000        
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)

可以使用其他查询 在这里,我将把表格称为" table"因为你没有给我们这个名字。 每次更新后都会:

UPDATE table SET inv_amt = 6000 WHERE Inv_no = 2

您必须使用以下查询:

UPDATE table SET totalcustinv = 
  (
    SELECT sum(inv_amt)
    FROM table as secondTable
    WHERE table .Inv_no >= secondTable.Inv_no
  )

此查询应将每行的totalcustinv设置为所有行的inv_amt之和,其中Inv_no小于或等于当前行。

当然,要使其工作,Inv_no必须在数字上具有可比性。因为你在每个Inv_no之后写了一个点,我担心它是一个文本,并且不容易在数字上进行比较。由于这篇文章应该回答你的问题,我不会说如何将TEXT转换成INT。

另一件事:我不确定它是否适用于您的SQL数据库。我在PostgreSQL上测试过,它运行得很好!