如何使用Power Query在Power BI中实现多列纵向堆叠
Power Query 多列堆叠(宽转长)实现方案
场景匹配说明
- 原始数据集结构:共4列,分别为
Processo、Finalidade 1、Finalidade 2、Finalidade 3,对应样例值如下:- Processo=1行:Finalidade 1为Maçã、Finalidade 2为Banana、Finalidade 3为Mamão
- Processo=2行:Finalidade 1为Banana、Finalidade 2/3为空值
- Processo=3行:Finalidade 1为Mamão、Finalidade 2为Banana、Finalidade 3为空值
- 目标输出:生成仅包含
Processo、Finalidade两列的结果表 - 核心规则:严格按照Finalidade 1→Finalidade 2→Finalidade 3的列顺序逐列纵向堆叠,每列堆叠时完整保留对应行的Processo值,所有原始空值不做过滤、直接保留在对应位置
常见操作误区
直接对全表执行转置操作无法满足需求:全表转置会整体互换表的行列关系,打乱
Processo字段与各Finalidade字段值的绑定关联,无法实现“每携带一个Finalidade值同步匹配对应Processo值”的逻辑。
分步操作流程
- 进入Power Query编辑器,加载目标原始数据集
- 选中
Processo列作为需要全程保留的关联键列 - 依次点击顶部「转换」选项卡 →「逆透视列」下拉菜单 →逆透视其他列
- 该操作会自动将未被选中的Finalidade 1/2/3列识别为待堆叠的属性列,逐行匹配对应的Processo值完成纵向拼接
- 将逆透视后自动生成的
值列重命名为Finalidade,删除自动生成的属性列即可得到基础堆叠结果- 系统默认会完整保留所有原始空值,无需额外设置规则过滤空值
- (可选)如果需要严格按照Finalidade 1→2→3的顺序排列堆叠结果,可增加辅助排序步骤:
- 保留逆透视生成的
属性列,新增自定义列,输入公式= if [属性] = "Finalidade 1" then 1 else if [属性] = "Finalidade 2" then 2 else 3 - 对新增的排序辅助列执行升序排序,确认顺序符合要求后删除
属性列和辅助排序列即可
- 保留逆透视生成的
参考M代码片段
let // 替换为你的实际数据源引用 原始数据源 = Excel.CurrentWorkbook(){[Name="原始表"]}[Content], // 以Processo为保留列,逆透视其余所有列 逆透视结果 = Table.UnpivotOtherColumns(原始数据源, {"Processo"}, "属性", "Finalidade"), // 新增按Finalidade列顺序的辅助排序列 排序辅助列 = Table.AddColumn(逆透视结果, "sort_key", each if [属性] = "Finalidade 1" then 1 else if [属性] = "Finalidade 2" then 2 else 3, Int64.Type), // 按辅助键排序保证堆叠顺序 排序完成 = Table.Sort(排序辅助列, {{"sort_key", Order.Ascending}}), // 删除冗余列得到最终结果 最终结果 = Table.RemoveColumns(排序完成, {"属性", "sort_key"}) in 最终结果
内容的提问来源于stack exchange,提问作者Carlos Guimarães
相关产品推荐
相关产品推荐

