Excel 表之间的组合的 Power Query 是啥?

Posted

技术标签:

【中文标题】Excel 表之间的组合的 Power Query 是啥?【英文标题】:What Power Query for combinations between Excel tables?Excel 表之间的组合的 Power Query 是什么? 【发布时间】:2021-04-26 07:23:47 【问题描述】:

虽然它在 SQL 中非常简单,但我无法获得在 Excel 中获取关联表之间的所有组合所需的 Power Query M 代码。这是我的(虚构的)表格和数据:

颜色:

ID Name
#FF0000 Red
#00FF00 Green
#0000FF Blue

对象:

ID Name
Obj001 Sofa
Obj002 Chair

油漆:

ID Name
Pnt001 Myrtle
Pnt002 Sunset

ColorInObject(第一个关联):

ObjectID ColorID
Obj001 #FF0000
Obj001 #00FF00
Obj002 #FF0000
Obj002 #0000FF

ColorInPaint(第二个关联):

PaintID ColorID
Pnt001 #FF0000
Pnt001 #0000FF
Pnt002 #00FF00
Pnt002 #0000FF

使用以下简单的 SQL 查询:

SELECT Object.Name, Paint.Name, Color.Name
FROM Object, Paint, Color, ColorInObject, ColorInPaint
WHERE ColorInObject.ColorID = Color.ID AND ColorInObject.ObjectID = Object.ID
AND ColorInPaint.ColorID = Color.ID AND ColorInPaint.PaintID = Paint.ID
AND ColorInObject.ColorID = ColorInPaint.ColorID

我通过颜色得到对象和绘画之间所有可能组合的以下预期结果:

Object.Name Paint.Name Color.Name
Sofa Myrtle Red
Chair Myrtle Red
Sofa Sunset Green
Chair Myrtle Blue
Chair Sunset Blue

如何使用 Power Query 在 Excel 中获得相同的结果?所需的 Power Query M 代码是什么?

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

通常,Power Query 的工作原理是一次仅连接两个表,因此您需要采取一系列步骤。

仅使用 GUI 合并和扩展列,您可以使用 M 代码获得最终结果,如下所示:

let
    Source = ColorInObject,
    #"Merged Queries" = Table.NestedJoin(Source, "ColorID", ColorInPaint, "ColorID", "ColorInPaint", JoinKind.LeftOuter),
    #"Expanded ColorInPaint" = Table.ExpandTableColumn(#"Merged Queries", "ColorInPaint", "PaintID", "PaintID"),
    #"Merged Queries1" = Table.NestedJoin(#"Expanded ColorInPaint", "ObjectID", Object, "ID", "Object", JoinKind.LeftOuter),
    #"Expanded Object" = Table.ExpandTableColumn(#"Merged Queries1", "Object", "Name", "Object.Name"),
    #"Merged Queries2" = Table.NestedJoin(#"Expanded Object", "ColorID", Color, "ID", "Color", JoinKind.LeftOuter),
    #"Expanded Color" = Table.ExpandTableColumn(#"Merged Queries2", "Color", "Name", "Color.Name"),
    #"Merged Queries3" = Table.NestedJoin(#"Expanded Color", "PaintID", Paint, "ID", "Paint", JoinKind.LeftOuter),
    #"Expanded Paint" = Table.ExpandTableColumn(#"Merged Queries3", "Paint", "Name", "Paint.Name"),
    #"Removed Other Columns" = Table.SelectColumns(#"Expanded Paint","Object.Name", "Color.Name", "Paint.Name")
in
    #"Removed Other Columns"

如果你手动修改 M,你可以减少一些冗长:

let
    JoinTables =
        Table.NestedJoin(
            Table.NestedJoin(
                Table.NestedJoin(
                    Table.Join(
                        ColorInPaint, "ColorID",
                        ColorInObject, "ColorID"
                    ), "ObjectID",
                    Object, "ID", "Object"
                ), "PaintID",
                Paint, "ID", "Paint"
            ), "ColorID",
            Color, "ID", "Color"
        ),
    Expand =
        Table.ExpandTableColumn(
            Table.ExpandTableColumn(
                Table.ExpandTableColumn(
                    JoinTables, "Object", "Name", "Object.Name"
                ), "Paint", "Name", "Paint.Name"
            ), "Color", "Name", "Color.Name"
        )
in
    Table.SelectColumns(Expand,"Object.Name", "Paint.Name", "Color.Name")

【讨论】:

谢谢亚历克西斯。这看起来不错,但我收到以下错误:“查询中发生错误。 Expression.Error:无法识别名称“ColorInPaint”。确保拼写正确。我是 Power Query 的新手,所以我可能在基本层面上遗漏了一些东西。表名称是我的 Excel 工作簿中的名称,Power Query 可能无法识别它们吗?如果是这样,我应该做哪些额外的操作/代码?再次感谢您。 您需要确保已将您提到的所有表加载到查询编辑器中,否则它不知道您指的是什么。 我终于自己找到了。奇迹般有效。非常感谢!【参考方案2】:

听起来你想要两个表中所有行的组合

通过突出显示范围并使用数据将第一个表加载到 powerquery .. 从表/范围 [x] 我的表有标题

添加列..自定义列...列名自定义和公式=1

文件关闭并加载

通过突出显示范围并使用数据将第二个表加载到 powerquery .. From Table/Range [x] 我的表有标题

添加列..自定义列...列名自定义和公式=1

Home .. Merge Queries ...点击顶部和底部的自定义并将连接类型更改为full outer。点击确定

单击新列顶部的 >>

【讨论】:

以上是关于Excel 表之间的组合的 Power Query 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Excel Power Query经典应用之二维表转一维表

在通过 Python 运行时维护 Excel 工作簿的 Power Query 连接

Power Query 将表类型数据加载到单个 Excel 工作表

Excel Power Query 索引列

Dax vs M(power query)表组合大表的最佳实践

Excel Power Query 拆分表格顶部/底部 50%