
但客户多、日期杂、数据多,手工算估计会头秃。 之前用Pandas写过一版(视频在文末),今天用Power Query实现。
这里有两个表格,一个是发货记录,有每天的发货金额明细;一个是回款明细,记录的是每个客户的回款日期和金额

现在的需求是:要统计出每个客户,每天的欠款金额。
这个需求,用Power Query如何解决?
其实之前也录过类似的案例,计算现金日记账的余额,思路是相通的。
先合并两个表,可以用“追加查询”
按客户进行分组,并将得到的结果表按日期升序排列
关键一步:将表格转为列表,再迭代处理。
PQ里没有Pandas的cumsum(累计求和),所以要用List.Accumulate手动迭代:
{{},0}(空列表+当前余额0)
再将列表转为表格,每天的余额就有了。如果每天有多条记录(比如一天发了3次货),需要按天合并,只保留最后一条余额。
再次分组合并,发货、回款及余额数据都在同一行显示。
要注意的是:欠款余额是取最后一个值,不能进行求和汇总
最后,把【计数】列深化出来,表格合并下即得到结果。
let 源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content], 更改的类型 = Table.TransformColumnTypes(源,{{"日期", type date}}), 追加的查询 = Table.Combine({更改的类型, 回款}), 分组的行 = Table.Group(追加的查询, {"客户"}, {"计数", each [ a=Table.Sort(_,{{"日期", Order.Ascending}}), b=List.Accumulate( Table.ToRows(a),{{},0},(x,y)=> { x{0} & { y & { List.Sum({x{1},y{3},-y{4}}) }}, List.Sum({x{1},y{3},-y{4}})}){0}, c=Table.FromRows (b,Table.ColumnNames(a)&{"欠款余额"}), d=Table.Group(c, {"日期", "客户"}, { {"商品", each Text.Combine([商品],",")}, {"发货金额", each List.Sum([发货金额])}, {"回款金额", each List.Sum([回款金额])}, {"欠款余额", each List.Last([欠款余额])}, {"回款方式", each Text.Combine([回款方式],",")}, {"备注", each Text.Combine([备注],",")}}) ][d]}), 自定义1 = Table.Combine( 分组的行[计数])in 自定义1pandas讲解视频
已关注关注重播 分享 赞Pandas适合会Python、数据量大的场景;
Power Query适合Excel用户、不想写代码的场景。
核心思路都是迭代累计:上一条余额 + 发货 - 回款 = 当前余额。
文件和完整代码,后台回复 "欠款计算" 自取。
遇到报错或想看Power BI版本(一个DAX公式搞定),评论区留言。
完
往期推荐: powerquery|保姆级教程!3分钟合并多个数据结构不同的表格,还能动态更新
HR/行政必看!3分钟学会powerquery考勤统计,从此告别手工计数
powerquery|后悔没早点知道这个方法,如何按标题分组
PowerQuery案例1:循环遍历快速对BOM层级分组并添加列,这个方法太香了! PowerQuery案例2:文本也能比大小?轻松搞定特殊分组 PowerQuery案例3:为什么别人的PQ加列不报错?秘密就藏在这段动态M代码里! owerQuery案例4:一维表转二维汇总表?除了动态列,逆透视也能搞定! PowerQuery案例5:合并单元格别手动拆,PQ自动填充汇总 PowerQuery案例6:区间分档别用IF套了,PQ动态匹配一改就生效 PowerQuery案例7:横表转竖表别手动复制了,PQ笛卡尔积自动规整