如何在Ledger Stock中实现累计求和?求技术解决方案
解决Ledger Stock累计求和的方案
嘿,我来帮你搞定这个Ledger Stock累计求和的问题!根据你给出的输入数据和期望输出,核心需求是按ProductId分组,按日期(以及账本ID)排序后,计算每一行的累计库存。
核心计算逻辑
累计库存的常规业务规则是:
- 每个产品的第一条记录,库存 = 当前行
Credit - Debit - 后续每一行的库存 = 上一行的累计库存 + 当前行
Credit - Debit
不同场景的实现方法
1. SQL数据库(推荐,适合批量数据处理)
如果你的数据存储在SQL数据库中,根据数据库版本不同,有两种实现方式:
方式一:支持窗口函数的数据库(MySQL 8.0+、SQL Server 2012+、PostgreSQL等)
用SUM() OVER()窗口函数可以简洁实现累计求和:
SELECT LedgerID, ProductId, TType, ProductName, Credit, Debit, -- 按产品分组,按日期+账本ID排序,累计计算Credit-Debit的总和 SUM(Credit - Debit) OVER ( PARTITION BY ProductId ORDER BY TDate, LedgerID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS Stock, TDate FROM your_ledger_table -- 替换成你的实际表名 ORDER BY TDate, LedgerID;
方式二:不支持窗口函数的旧版数据库(MySQL 5.x等)
用用户变量来实现累计计算:
-- 初始化变量 SET @prev_product = NULL; SET @cumulative_stock = 0; SELECT LedgerID, ProductId, TType, ProductName, Credit, Debit, -- 判断是否为同产品,更新累计库存 @cumulative_stock := CASE WHEN ProductId != @prev_product THEN Credit - Debit ELSE @cumulative_stock + Credit - Debit END AS Stock, TDate, @prev_product := ProductId -- 更新上一个产品ID标记 FROM your_ledger_table ORDER BY ProductId, TDate, LedgerID;
2. Excel/表格工具(适合小批量数据手动处理)
如果你的数据在Excel里,可以用简单公式快速实现:
- 假设累计库存列是H列,数据从第2行开始
- H2单元格输入:
=D2-E2(计算第一条记录的初始库存) - H3单元格输入:
=H2+D3-E3(基于上一行累计值计算当前行) - 选中H3单元格,下拉填充到所有行即可
注意事项
你给出的期望输出里第三、四行的Stock仍为30,这和常规的累计逻辑(减去Debit)不符,可能是示例未写完或者有特殊业务规则。如果你的需求有特殊逻辑(比如Debit暂不影响库存),可以调整公式中的计算规则哦。
内容的提问来源于stack exchange,提问作者Genish Parvadia
相关产品推荐
相关产品推荐

