You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL实现STOCK表中Current quantity的自动累计计算(基于BUY与SELL列)

当然可以实现!用SQL窗口函数轻松搞定累计库存计算

作为SQL和VB.NET的新手,这个自动计算库存的需求完全可以通过SQL实现,逻辑清晰且易上手,我给你分场景详细讲解:

1. 先查询计算结果(不修改原表)

如果只是想查看计算后的库存数据,不需要改动原表,用窗口函数是最简洁的方案,主流数据库(SQL Server、MySQL 8.0+、PostgreSQL等)都支持:

SELECT 
    ID,
    Date,
    BUY,
    SELL,
    -- 按ID顺序累计计算BUY-SELL的总和
    SUM(BUY - SELL) OVER(ORDER BY ID) AS [Current quantity]
FROM STOCK;

代码说明:

  • SUM(BUY - SELL) 计算当前行的净库存变化(买入量减去卖出量)
  • OVER(ORDER BY ID) 指定按ID的顺序累计求和,每一行的结果就是从第一行到当前行的净变化总和,完美匹配你要的「上一行库存+当前行BUY-SELL」规则
  • 如果业务中Date的顺序比ID更可靠,也可以把ORDER BY ID改成ORDER BY Date,避免ID顺序和实际业务时间不一致的问题

执行这段SQL后,就能得到你预期的结果:

ID | Date | BUY | SELL | Current quantity
1 | 01/01/22 | 88 | 0 | 88
2 | 03/01/22 | 22 | 0 | 110
3 | 05/02/22 | 0 | 30 | 80

2. 更新原表的Current quantity列

如果需要把计算结果直接写入表中的Current quantity列,不同数据库的写法略有差异:

针对SQL Server的写法:

用CTE(公共表表达式)先计算出每一行的目标值,再关联更新原表:

WITH CalculatedStock AS (
    SELECT 
        ID,
        SUM(BUY - SELL) OVER(ORDER BY ID) AS NewCurrentQuantity
    FROM STOCK
)
UPDATE STOCK
SET [Current quantity] = NewCurrentQuantity
FROM STOCK
JOIN CalculatedStock ON STOCK.ID = CalculatedStock.ID;

针对MySQL的写法:

可以用用户变量实现累计计算:

SET @running_total = 0;
UPDATE STOCK
SET `Current quantity` = @running_total := @running_total + BUY - SELL
ORDER BY ID;

3. 在VB.NET中调用SQL实现自动计算

如果要在VB.NET程序里执行这个逻辑,通过ADO.NET连接数据库并执行上述SQL即可,示例代码(以SQL Server为例):

Imports System.Data.SqlClient

Module StockCalculator
    Sub Main()
        ' 替换成你的数据库连接字符串
        Dim connectionString As String = "Data Source=你的服务器地址;Initial Catalog=你的数据库名;Integrated Security=True;"
        
        Using conn As New SqlConnection(connectionString)
            Try
                conn.Open()
                ' 执行更新库存的SQL语句
                Dim updateSql As String = "WITH CalculatedStock AS (SELECT ID, SUM(BUY - SELL) OVER(ORDER BY ID) AS NewCurrentQuantity FROM STOCK) UPDATE STOCK SET [Current quantity] = NewCurrentQuantity FROM STOCK JOIN CalculatedStock ON STOCK.ID = CalculatedStock.ID;"
                
                Using cmd As New SqlCommand(updateSql, conn)
                    Dim rowsAffected As Integer = cmd.ExecuteNonQuery()
                    Console.WriteLine($"成功更新了 {rowsAffected} 行库存数据!")
                End Using
            Catch ex As Exception
                Console.WriteLine($"执行出错:{ex.Message}")
            End Try
        End Using
    End Sub
End Module

这样就能在程序里自动完成库存的计算和填充了。

内容的提问来源于stack exchange,提问作者Bislim Pireva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:17:50