Power Query递归求和报错:Excel条件累计公式转换求助
解决Power Query中条件累计求和(按ID分组+日期判断)的问题
Power Query不允许自定义列递归引用自身,所以直接引用上一行Sum列的写法会报错。要实现你需要的逻辑,核心思路是按ID分组后,用List.Accumulate逐行计算累计值,具体步骤如下:
前提准备
确保数据已按id和Month升序排序,保证累加的顺序正确:
#"Sorted Rows" = Table.Sort(Source,{{"id", Order.Ascending}, {"Month", Order.Ascending}})
核心分组累加逻辑
按id分组,对每组内的数据用List.Accumulate实现条件累加:
#"Grouped by ID" = Table.Group(#"Sorted Rows", {"id"}, { {"GroupedData", (group) => let // 给组内数据添加索引,方便遍历 #"Added Group Index" = Table.AddIndexColumn(group, "GroupIndex", 0, 1), // 转成记录列表,用List.Accumulate逐行计算Sum #"Calculated Sum" = Table.FromRecords( List.Accumulate( // 从第二行开始遍历,第一行单独处理 List.Skip(Table.ToRecords(#"Added Group Index")), // 初始化累加状态:第一行的Sum值按条件计算 {#"Added Group Index"{0} & [Sum = if #"Added Group Index"{0}[less than year] <= Date.EndOfMonth(#"Added Group Index"{0}[Month]) then #"Added Group Index"{0}[MaxCap] else 0]}, // 累加逻辑:每一行基于上一行的Sum计算当前值 (accumulatedList, currentRow) => let lastRow = List.Last(accumulatedList), currentSum = if currentRow[less than year] <= Date.EndOfMonth(currentRow[Month]) then lastRow[Sum] + currentRow[MaxCap] else 0 in accumulatedList & {currentRow & [Sum = currentSum]} ) ) in #"Calculated Sum" } })
展开分组结果
最后展开分组后的表格,得到包含Sum列的完整数据:
#"Expanded GroupedData" = Table.ExpandTableColumn(#"Grouped by ID", "GroupedData", {"Month", "less than year", "MaxCap", "Sum"})
逻辑说明
List.Accumulate是Power Query处理迭代累加的标准方法,完全规避了递归引用的问题- 分组操作保证同一
id的行在同一组内计算,排序确保累加顺序和Excel一致 - 每一行的
Sum计算严格对应你的需求:- 满足日期条件时,同一
id下的行用上一行Sum加当前MaxCap - 日期条件满足但换了
id(分组后自动处理,新组第一行直接取MaxCap) - 不满足日期条件时返回0
- 满足日期条件时,同一
内容的提问来源于stack exchange,提问作者3y3s
相关产品推荐
相关产品推荐

