从数据到Excel自动化报表:Power Query和Power Pivot实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.6 一个例子说明“合并查询的6个联接类型”

小勤:大海,关联表的合并查询功能里的联接种类怎么这么多啊?有左外部、右外部、完全外部、内部、左反、右反共6种,分别都是什么意思呢(见图3-40)?

图3-40 Power Query中的表间联接种类

大海:其实括号里的文字就表达了它们的意思了。只是因为没有具体数据,所以不太好理解而已。

小勤:看概念和文字真的很难理解,即使理解了,感觉心里还是没底。

大海:对。因为没有数据带来的感观认识,即使感觉上理解了,也很难达到活用的状态。所以,我专门准备了一套简单的数据来演示给你看,回头你也分别操作一下,然后对比一下结果,这样就感觉很明显了。

小勤:这真是太好了!

大海:我这里有一个订单表和一个订单明细表。先看一下这两个表的情况,其中,订单表里有一些数据是明细表里没有的,明细表里也有一些数据是订单表里没有的。

另外,在后面操作时将基于订单表创建合并查询,然后选明细表,所以这里将订单表叫左表,将明细表叫右表,如图3-41所示。

图3-41 示例数据说明

接下来将两个表的数据都获取到Power Query里。因为只需要在Power Query里观察各种联接类型的结果,所以只需要以“仅创建连接”方式获取数据。

Step 01 通过“以表格”方式获取订单表到Power Query里后,修改查询名称为“订单表”,如图3-42所示。

Step 02 同样,通过“以表格”方式获取明细表到Power Query中,然后修改查询名称,如图3-43所示。

图3-42 修改订单表查询名称

图3-43 修改订单明细表的查询名称

Step 03 为了让结果比较更明显一点,我们把两个表的其他列都删掉,只剩订单ID列:分别选中“订单表”或“订单明细”查询,单击“订单ID”列的列名以选中该列,切换到“开始”选项卡,单击“删除列”按钮,在下拉菜单中选择“删除其他列”命令,如图3-44和图3-45所示。

图3-44 删除订单表中不需要的列

图3-45 删除订单明细表中不需要的列

Step 04 单击“订单表”查询,切换到“开始”选项卡,单击“合并查询”按钮,在下拉菜单中选择“将查询合并为新查询”命令,如图3-46所示。

Step 05 生成左外部查询:在弹出的对话框中选择“订单明细”表,并依次单击两表中的“订单ID”列完成匹配,在“联接种类”中选择“左外部(第一个中的所有行,第二个中的匹配行)”选项,单击“确定”按钮,如图3-47所示。

图3-46 合并到新查询

图3-47 设置“左外部”合并查询

Step 06 展开合并数据:单击“订单明细”列右侧的数据展开按钮,保持“使用原始列名作为前缀”复选框为选中状态,单击“确定”按钮,如图3-48所示。

Step 07 修改查询名称:单击选中新生成的查询“Merge1”,在“查询设置”的“属性/名称”中将“名称”修改为“左外部”,如图3-49所示。

图3-48 展开合并查询的结果数据

图3-49 修改查询的名称

Step 08 重复Step 04 ~Step 07 分别生成右外部、完全外部、内部、左反、右反查询,结果如图3-50所示。

图3-50 选择不同的联接类型

接下来开始比较各种联接类型的结果。

● 左外部:只要订单表(左表)里有的数据,结果表里都会有。但明细表(右表)里有些列没有数据,所以匹配过来后会成为null(空值),如图3-51所示。

● 右外部:和左外部相反,即明细表(右表)里有的数据,结果表里都会有。但因为订单表(左表)里有部分数据没有,所以合并后用null值表示,如图3-52所示。

图3-51 左外部查询的结果

图3-52 右外部查询的结果

● 完全外部:不管哪个表里的数据,全都进入结果表。对于一方没有的数据,合并后显示为null值,如图3-53所示。

● 内部:跟“完全外部”相反,两个表都有的数据才进入结果表,如图3-54所示。

图3-53 完全外部查询的结果

图3-54 内部查询的结果

● 左反:只有订单表(左表)有而明细表(右表)没有的数据,才进结果表。这种用法经常用于检查哪些订单缺了明细表等,如图3-55所示。

● 右反:和“左反”相反,只有明细表(右表)有而订单表(左表)没有的数据,才进入结果表,如图3-56所示。

图3-55 左反查询的结果

图3-56 右反查询的结果

最后总结见表 3-1(“我”表示左表,“你”表示右表)。

表3-1 Power Query合并查询联接种类参考表

表3-1中的函数参数是进行合并操作时生成的代码参数,如图3-57所示。

图3-57 合并查询操作生成的代码及参数

如果在Power Query的操作中可以选择相应的联接类型,则这些参数会自动生成。对于版本比较低的用户,如果操作过程中不能选择需要的联接类型,可在合并后生成的代码中直接加入或修改该参数来达到相应的效果。