Power Query按分组循环计算期初/期末库存的实现问题求助
Power Query 按物品独立计算库存期初/期末值的解决方案
核心问题解决步骤
你的需求是按物品独立计算每日的Begin Inv.和End Inv.,其中次日Begin Inv.等于前一日End Inv.,可以通过分组+List.Accumulate迭代计算实现,具体操作如下:
按物品分组
进入Power Query编辑器,点击「转换」选项卡 → 「分组依据」,设置:- 分组列:选择你的物品名称列(比如“物品”)
- 新列名:输入
GroupedRows - 操作:选择「所有行」
点击确定后,数据会按物品分成每组一行的结构,每行包含该物品的所有原始数据行。
添加自定义列实现迭代计算
点击「添加列」选项卡 → 「自定义列」,粘贴以下M代码(根据你的实际列名调整,比如Begin Inv.、Delta是你的原始列名):let Rows = [GroupedRows], // 获取当前物品第一天的期初库存 InitialBegin = Rows[Begin Inv.]{0}, // 获取该物品所有日期的Delta值列表 DeltaList = Rows[Delta], // 用List.Accumulate迭代计算每日库存 Accumulated = List.Accumulate(DeltaList, // 初始状态:第一天的期初、期末,以及结果集合 [CurrentBegin = InitialBegin, CurrentEnd = InitialBegin + DeltaList{0}, Result = {{InitialBegin, InitialBegin + DeltaList{0}}}], (state, currentDelta) => let NewBegin = state[CurrentEnd], NewEnd = NewBegin + currentDelta, UpdatedResult = state[Result] & {{NewBegin, NewEnd}} in [CurrentBegin = NewBegin, CurrentEnd = NewEnd, Result = UpdatedResult] ), // 将计算结果转为表格 InvTable = Table.FromList(Accumulated[Result], Splitter.SplitByNothing(), {"Begin Inv.", "End Inv."}), // 给计算表添加索引,和原始行对齐 InvTableWithIndex = Table.AddIndexColumn(InvTable, "Index", 0, 1), // 给原始行添加索引,用于合并 RowsWithIndex = Table.AddIndexColumn(Rows, "Index", 0, 1), // 合并原始行和计算后的库存列 CombinedTable = Table.Join(RowsWithIndex, "Index", InvTableWithIndex, "Index"), // 删除多余的索引列 FinalTable = Table.RemoveColumns(CombinedTable, {"Index"}) in FinalTable点击确定后,会得到包含计算后库存列的表格。
展开表格并整理
点击自定义列右侧的展开按钮,选择所有需要保留的列(除了GroupedRows),点击确定后,就得到了按物品独立计算的每日Begin Inv.和End Inv.。
学习渠道推荐
作为入门两周的学习者,推荐几个实用的学习路径:
- 官方文档:微软Power Query M语言官方参考,覆盖所有函数的详细说明和基础示例,适合查缺补漏。
- 国内论坛:ExcelHome论坛的Power Query板块,有大量真实业务案例和用户分享的解决方案,遇到问题可以发帖求助。
- 书籍:《Power Query实战:数据处理与分析》,从基础操作到M语言进阶都有系统讲解,适合入门到提升。
- 免费视频:国内视频平台搜索“Power Query 入门教程”,有很多系列免费课程,跟着实操能快速上手。
内容的提问来源于stack exchange,提问作者joshlin
相关产品推荐
相关产品推荐

