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 是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在通过 Python 运行时维护 Excel 工作簿的 Power Query 连接
Power Query 将表类型数据加载到单个 Excel 工作表