如何用Power Query实现不同月份客户财务数据的正确全连接?
解决Power Query中Full Join后客户列出现Null的问题
原始数据
二月开票数据(Feb 23)
| customer | feb 23 |
|---|---|
| customer 1 | $1000 |
| customer 2 | $2000 |
| customer 4 | $4000 |
三月开票数据(Mar 23)
| customer | mar 23 |
|---|---|
| customer 1 | $1000 |
| customer 3 | $3000 |
| customer 5 | $5000 |
问题描述
使用Full Outer Join合并后,来自三月表的customer 3、customer 5对应的customer列显示为null,无法实现所有客户统一展示、无数据月份显示$0的预期效果。
解决方案
步骤1:统一客户列数据类型
确保两个表的customer列均为文本类型,避免因类型不匹配导致匹配失败。在Power Query编辑器中选中列,点击「转换」→「数据类型」→「文本」。
步骤2:执行完全外部合并
- 将两个月份的数据加载到Power Query,分别命名为
Feb23和Mar23。 - 选中
Feb23,点击「合并查询」→「合并查询作为新查询」。 - 在合并窗口中,选择
Mar23为合并对象,匹配列选择两个表的customer,连接类型选择「完全外部」。
步骤3:合并客户列,修复Null值
合并后会生成包含customer、feb 23、Mar23(嵌套列)的表:
- 展开
Mar23列,仅选择mar 23字段。 - 添加自定义列,公式为:
= if [customer] = null then [Mar23.customer] else [customer] - 将自定义列重命名为
customer,删除原customer列和Mar23.customer列(若存在)。
步骤4:替换空值为$0
选中feb 23和mar 23列,点击「转换」→「替换值」,将null替换为$0。如果是数值类型数据,可先替换为0,再设置单元格格式为货币。
完整M代码示例
let // 加载二月数据 Feb23 = Table.FromRecords({ [customer = "customer 1", #"feb 23" = "$1000"], [customer = "customer 2", #"feb 23" = "$2000"], [customer = "customer 4", #"feb 23" = "$4000"] }), // 加载三月数据 Mar23 = Table.FromRecords({ [customer = "customer 1", #"mar 23" = "$1000"], [customer = "customer 3", #"mar 23" = "$3000"], [customer = "customer 5", #"mar 23" = "$5000"] }), // 完全外部合并 Merged = Table.FullOuterJoin(Feb23, "customer", Mar23, "customer", JoinKind.FullOuter), // 合并客户列,替换null CombinedCustomer = Table.AddColumn(Merged, "customer_combined", each if [customer] = null then [Mar23.customer] else [customer]), // 删除多余列并重命名 CleanedColumns = Table.RenameColumns(Table.RemoveColumns(CombinedCustomer, {"customer", "Mar23.customer"}), {{"customer_combined", "customer"}}), // 替换空值为$0 ReplaceNulls = Table.ReplaceValue(CleanedColumns, null, "$0", Replacer.ReplaceValue, {"feb 23", "mar 23"}), // 调整列顺序 ReorderedColumns = Table.ReorderColumns(ReplaceNulls, {"customer", "feb 23", "mar 23"}) in ReorderedColumns
最终结果
| customer | feb 23 | mar 23 |
|---|---|---|
| customer 1 | $1000 | $1000 |
| customer 2 | $2000 | $0 |
| customer 3 | $0 | $3000 |
| customer 4 | $4000 | $0 |
| customer 5 | $0 | $5000 |
内容的提问来源于stack exchange,提问作者Ratguy
相关产品推荐
相关产品推荐

