如何在Power Query中用上一行平均值计算车队柴油库存指标?
在Power Query中实现逐行依赖的柴油库存计算
要处理这种需要引用上一行计算结果的库存跟踪需求,Power Query可以通过List.Accumulate函数实现迭代计算,携带并更新上一次的库存状态(数量、价值、均价),具体方案如下:
1. 核心思路
利用List.Accumulate遍历每行数据,每次迭代时根据当前行的操作类型(采购/消耗),基于上一轮的库存状态计算新的库存数据:
- 采购操作:库存数量累加采购量,库存价值累加采购金额,新均价为总价值除以总数量
- 消耗操作:库存数量扣减消耗量,库存价值按上一轮均价扣减对应金额,均价保持上一轮数值
2. 具体M代码示例
假设你的输入表包含日期、操作类型、数量(升)、采购单价(元/升)列,代码如下:
let Source = 你的数据源表, // 将表转换为记录列表,方便逐行迭代 RowRecords = Table.ToRecords(Source), // 初始化初始库存状态:数量、价值、均价都为0 InitialStock = [库存数量=0, 库存价值=0, 均价=0], // 迭代计算每一行的库存变化 CalculatedStock = List.Accumulate(RowRecords, InitialStock, (prevState, currentRow) => let OpType = currentRow[操作类型], Qty = currentRow[数量(升)], // 处理采购/消耗的不同计算逻辑 NewQty = if OpType = "采购" then prevState[库存数量] + Qty else prevState[库存数量] - Qty, NewValue = if OpType = "采购" then prevState[库存价值] + Qty * currentRow[采购单价(元/升)] else prevState[库存价值] - Qty * prevState[均价], // 避免除以0的边界处理 NewAvg = if NewQty = 0 then 0 else NewValue / NewQty in // 保留当前行数据+新库存状态 [当前行=currentRow, 库存数量=NewQty, 库存价值=NewValue, 均价=NewAvg] ), // 合并记录并转换为最终表格 ResultList = List.Transform(CalculatedStock, each Record.Combine({_[当前行], [库存数量=_[库存数量], 库存价值=_[库存价值], 均价=_[均价]]})), FinalTable = Table.FromRecords(ResultList) in FinalTable
3. 适配调整说明
- 根据你的实际列名修改代码中的字段名称(比如
操作类型、数量(升)等) - 若有其他业务规则(如库存不能为负),可在
NewQty计算后添加判断逻辑 - 可通过调整
InitialStock的初始值,适配已有初始库存的场景
内容的提问来源于stack exchange,提问作者DSCintra
相关产品推荐
相关产品推荐

