![从数据到Excel自动化报表:Power Query和Power Pivot实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/763/25449763/b_25449763.jpg)
3.6 一个例子说明“合并查询的6个联接类型”
小勤:大海,关联表的合并查询功能里的联接种类怎么这么多啊?有左外部、右外部、完全外部、内部、左反、右反共6种,分别都是什么意思呢(见图3-40)?
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0053-0116.jpg?sign=1739127776-x2EZLYE29EydjF539umooVv7i16m4ks2-0-289e25934575311b51a6ff9dc32c5f77)
图3-40 Power Query中的表间联接种类
大海:其实括号里的文字就表达了它们的意思了。只是因为没有具体数据,所以不太好理解而已。
小勤:看概念和文字真的很难理解,即使理解了,感觉心里还是没底。
大海:对。因为没有数据带来的感观认识,即使感觉上理解了,也很难达到活用的状态。所以,我专门准备了一套简单的数据来演示给你看,回头你也分别操作一下,然后对比一下结果,这样就感觉很明显了。
小勤:这真是太好了!
大海:我这里有一个订单表和一个订单明细表。先看一下这两个表的情况,其中,订单表里有一些数据是明细表里没有的,明细表里也有一些数据是订单表里没有的。
另外,在后面操作时将基于订单表创建合并查询,然后选明细表,所以这里将订单表叫左表,将明细表叫右表,如图3-41所示。
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0053-0117.jpg?sign=1739127776-YdpAOt2pXV37QOJkInaShNAtzurwuzZy-0-189ed0b3e99c6c0f4009d3992e55c481)
图3-41 示例数据说明
接下来将两个表的数据都获取到Power Query里。因为只需要在Power Query里观察各种联接类型的结果,所以只需要以“仅创建连接”方式获取数据。
Step 01 通过“以表格”方式获取订单表到Power Query里后,修改查询名称为“订单表”,如图3-42所示。
Step 02 同样,通过“以表格”方式获取明细表到Power Query中,然后修改查询名称,如图3-43所示。
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0054-0118.jpg?sign=1739127776-Xq3IIrFQiI0f4UY395EoeYdHYZ2UbQ23-0-91f55cb43da643b2cc4769492fc163fa)
图3-42 修改订单表查询名称
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0054-0119.jpg?sign=1739127776-SJgW7L1Z3P0RuFMmhB08kVfKC6W2TWvB-0-9b4b25dacbee5cbba79fb1dc71b334d0)
图3-43 修改订单明细表的查询名称
Step 03 为了让结果比较更明显一点,我们把两个表的其他列都删掉,只剩订单ID列:分别选中“订单表”或“订单明细”查询,单击“订单ID”列的列名以选中该列,切换到“开始”选项卡,单击“删除列”按钮,在下拉菜单中选择“删除其他列”命令,如图3-44和图3-45所示。
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0054-0120.jpg?sign=1739127776-3mtFawofQKt8zaFn8EHRuSY4NLflLicz-0-4cc9ecdb5b7586f8f836723490235242)
图3-44 删除订单表中不需要的列
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0054-0121.jpg?sign=1739127776-mzxlSHNz0mZHbjJ7Szl3TcU22LzNIbo7-0-f9d2dd3cdc67be47a0750851fd8ed3c0)
图3-45 删除订单明细表中不需要的列
Step 04 单击“订单表”查询,切换到“开始”选项卡,单击“合并查询”按钮,在下拉菜单中选择“将查询合并为新查询”命令,如图3-46所示。
Step 05 生成左外部查询:在弹出的对话框中选择“订单明细”表,并依次单击两表中的“订单ID”列完成匹配,在“联接种类”中选择“左外部(第一个中的所有行,第二个中的匹配行)”选项,单击“确定”按钮,如图3-47所示。
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0055-0122.jpg?sign=1739127776-F59NlWwwcILVCh3QcTYqNhWZBzStyF6P-0-1aa08004fc6cb551f977d45bd87c29dd)
图3-46 合并到新查询
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0055-0123.jpg?sign=1739127776-wjA6RakMaJb9QHAOuuPceJF56j1GuV63-0-a97fb3ffd0e6a75c2adcb2206d61ec19)
图3-47 设置“左外部”合并查询
Step 06 展开合并数据:单击“订单明细”列右侧的数据展开按钮,保持“使用原始列名作为前缀”复选框为选中状态,单击“确定”按钮,如图3-48所示。
Step 07 修改查询名称:单击选中新生成的查询“Merge1”,在“查询设置”的“属性/名称”中将“名称”修改为“左外部”,如图3-49所示。
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0056-0124.jpg?sign=1739127776-yvFyGwqI7UPmUUsHaeafgIUVYaKGXFKX-0-edc50119aa9400307ad15c72fc1f3496)
图3-48 展开合并查询的结果数据
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0056-0125.jpg?sign=1739127776-uhCyTLFpR8BsqaCSB5pbolGvJFddQc7p-0-bca51bd8ab4d6a19e06dcbcfab63f8ac)
图3-49 修改查询的名称
Step 08 重复Step 04 ~Step 07 分别生成右外部、完全外部、内部、左反、右反查询,结果如图3-50所示。
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0056-0126.jpg?sign=1739127776-0wtvBSdzEEdElNKOyZPmgHOSacIOR9B0-0-ffff647bef3d02793b56a10865f94730)
图3-50 选择不同的联接类型
接下来开始比较各种联接类型的结果。
● 左外部:只要订单表(左表)里有的数据,结果表里都会有。但明细表(右表)里有些列没有数据,所以匹配过来后会成为null(空值),如图3-51所示。
● 右外部:和左外部相反,即明细表(右表)里有的数据,结果表里都会有。但因为订单表(左表)里有部分数据没有,所以合并后用null值表示,如图3-52所示。
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0057-0127.jpg?sign=1739127776-CAURi4C2WSjdoma9JhcNJhmonT3TSo6V-0-3d1596d925102aa3ac82886ffe9292e5)
图3-51 左外部查询的结果
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0057-0128.jpg?sign=1739127776-0bfKkj81SXGnIH9dtAlinVPX0TIhhzdu-0-6f8554cfb4f28d16faa2697544daefd6)
图3-52 右外部查询的结果
● 完全外部:不管哪个表里的数据,全都进入结果表。对于一方没有的数据,合并后显示为null值,如图3-53所示。
● 内部:跟“完全外部”相反,两个表都有的数据才进入结果表,如图3-54所示。
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0057-0129.jpg?sign=1739127776-hYJ2mJupHYQ9jhywAyN7qJUi6651TOh1-0-dff76932398c11ef3879f5092e2ff715)
图3-53 完全外部查询的结果
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0057-0130.jpg?sign=1739127776-OXS5wtnRtM4qLQui2qbL6mUReglZsrLk-0-23ad3877bc6d537888cbb9298c2968e7)
图3-54 内部查询的结果
● 左反:只有订单表(左表)有而明细表(右表)没有的数据,才进结果表。这种用法经常用于检查哪些订单缺了明细表等,如图3-55所示。
● 右反:和“左反”相反,只有明细表(右表)有而订单表(左表)没有的数据,才进入结果表,如图3-56所示。
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0057-0131.jpg?sign=1739127776-2WS63fqoxSfBTJ1OZYi8mZvMh6tAbPG4-0-52572914febc0e41582b232c789b0326)
图3-55 左反查询的结果
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0057-0132.jpg?sign=1739127776-AnfXhSLrJNmPuvd9zbbgsZfiodjoxc8g-0-2147670ff58bb04a0b01af3bd1f4338f)
图3-56 右反查询的结果
最后总结见表 3-1(“我”表示左表,“你”表示右表)。
表3-1 Power Query合并查询联接种类参考表
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0058-0133.jpg?sign=1739127776-17GKGK6GPOGVicMxdrnc3umDVMaIZcoq-0-8f66bfb879e5bd1117f5fb96f74c2ab3)
表3-1中的函数参数是进行合并操作时生成的代码参数,如图3-57所示。
![](https://epubservercos.yuewen.com/618DAF/13898201703280306/epubprivate/OEBPS/Images/35681-0058-0134.jpg?sign=1739127776-cIHVkWpfMLgxhzxJazCcjc2VNuoknRGN-0-40bc9e6c6dc34242ba80474eac58bffd)
图3-57 合并查询操作生成的代码及参数
如果在Power Query的操作中可以选择相应的联接类型,则这些参数会自动生成。对于版本比较低的用户,如果操作过程中不能选择需要的联接类型,可在合并后生成的代码中直接加入或修改该参数来达到相应的效果。