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
相关产品推荐
相关产品推荐

