Power Query引用查询添加累计列时触发List类型字段访问报错
Power Query引用查询添加累计列时触发List类型字段访问报错
嗨,看你在Power Query里直接引用查询加累计列的时候碰了壁,这种情况我之前折腾过好多次,咱们来一步步把问题捋顺。
你原来的代码能在直接引用工作簿表的时候正常运行,是因为Excel.CurrentWorkbook(){[Name="Table1"]}[Amount]是精准定位到工作簿里的表,直接取出了Amount列的纯数值List;但换成Source = #"Query1"[Amount]的时候,大概率是#"Query1"的返回结构和你预期的不一样——比如它可能不是完全展开的扁平表,或者你直接取列的时机不对,导致Power Query误把它当成List类型去访问字段,自然就触发报错了。
给你两个靠谱的解决方案,按需选就行:
方案1:保留自定义累计函数fxRunningTotal的写法
先确认#"Query1"返回的是标准扁平表(没有嵌套列)且包含Amount列,然后用下面的代码替换原有逻辑:
= let Source = #"Query1", // 直接引用整个查询,它返回完整的交易记录表 BufferedAmount = List.Buffer(Source[Amount]), // 缓存Amount列的数值List,提升计算效率 RunningTotalList = fxRunningTotal(BufferedAmount), // 调用自定义累计函数生成累计值List // 合并原表所有列与累计值List,生成带累计列的新表 Result = Table.FromColumns( Table.ToColumns(Source) & {RunningTotalList}, Table.ColumnNames(Source) & {"Running Total"} ) in Result
这个写法会完整保留原表的所有字段,比你之前只保留Amount列的逻辑更实用。
方案2:用Power Query原生函数实现(无需自定义函数)
如果你不想依赖自定义的fxRunningTotal,可以直接用原生函数写,代码更简洁:
= let Source = #"Query1", BufferedAmount = List.Buffer(Source[Amount]), Result = Table.AddColumn(Source, "Running Total", (currentRow) => List.Sum(List.Take(BufferedAmount, Table.PositionOf(Source, currentRow) + 1)) ) in Result
小提示:这个写法在处理超大数据表时,性能会比方案1稍差一些,但日常中小规模的交易记录完全够用。
最后排查两个容易踩坑的点
如果还是报错,先检查这两处:
- 确认
#"Query1"的最后一步是完全展开的扁平表,没有嵌套的List或Record类型列; - 确认Amount列是数值类型(如果是文本格式,记得先转成数值再计算)。
备注:内容来源于stack exchange,提问作者Dion
相关产品推荐
相关产品推荐

