Power BI之DAX神功:第3卷第7回 别以为你会用UNION函数
在《孙兴华讲火力全开》中,UNION函数我们只是简单介绍。现在是原理课,我们今天重点讲一下UNION的原理知识。

一、UNION函数最简单的介绍
作用:将多张表连接到一起。(下限最少2张表,上限没试过)

以上三张表不存在任何连线关系
【新建表】合并表 = UNION('表1','表2','表3')

二、当UNION参数都是表时,它要求表的列数和列顺序必需相同
// 第1列找第1列,第2列找第2列,以此类推。参数第1张表的列名决定了合并表的列名。如果你列的顺序不对,合并后内容就错了。

结果:

三、UNION函数对合并结果不去重
// 有SQL基础的朋友要注意,DAX中的UNION与SQL中的UNION是反着的,类似于SQL中UNION ALL的存在
证明:

结果:
【新建表】合并表 = UNION('表1','表2','表3')

四、配合DISTINCT使用对合并表去重
【新建表】合并表 = distinct(UNION('表1','表2','表3'))
// 详见《DAX神功》第1卷第9回

五、将指定列进行合并
// ALL、VALUES、DISTINCT函数你根据需求使用。三者区别我们已经在之前的课程多反复讲过了。
【新建表】合并表 = UNION(VALUES('表1'[姓名]),VALUES('表2'[名称]),VALUES('表3'[名字]))

六、UNION结果是否具有数据沿袭
<1> 来自相同表、相同名称的列

需求:一班和二班同学,每个人的平均成绩
// UNION函数中所有表都来自相同表、相同列,结果保持了数据沿袭

<2> 更多复杂情况
PS: 此案例出于教学目的,实际工作中你应该将表5和表6合并成一张表
注意:以下三张表没有任何连线关系

【1】合并表来自相同表、相同列,失去数据沿袭时的处理方法
返回结果:

原因:CALCULATE(AVERAGE('表7'[分数])) 来自表7,但是因为表5和表7之间并无连线关系,两个没有关系的表是不存在数据沿袭的。
解决方案:

返回结果:

【2】不同表、相同列与不同表、不同列失去数据沿袭,但有处理方法
<1> 不同表、不同列失去数据沿袭

<2> 不同表、相同列失去数据沿袭

【3】恢复数据沿袭方法一:将指定列应用到筛选器
// 这种方法只限于3个表中都有的列,一般是主键与外键的关系

如果我们使用表5中姓名和表6中name列,真的就不可以实现相同效果了吗?权威指南上面没有举例,但是我们可以通过之前学习的知识实现。方法不只一种,大家可以随意发挥
第一步:新建表
tb1 = DISTINCT(UNION('表5','表6'))

第二步:tb1与表7进行虚拟连线
// 详见《DAX神功》第2卷第21回

第三步:通过虚拟关系实现不同列名保持数据沿袭

【4】恢复数据沿袭方法二:TREATAS恢复沿袭


七、UNION合并时列名由第1参数决定,数据类型具体情况具体分析

《DAX神功》第1卷第4回 给大家讲过,当一个列中既有数值类型又有文本类型时,它默认使用可以通过用的文本类型。如果都是数值型,优先使用数值型。

孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等