UNION函数属于集合函数,可以对表实现数学定义上的取并集操作,将返回多个表纵向追加后的所有行形成的单个表。
语法和作用
语法:
UNION ( <Table1>, <Table2>, [<TableN> ...] )
作用:对参数指定的多个表取并集,将返回多个表纵向追加后的所有行形成的单个表。
注意:
1、参数指定的每个表的列数都要一致。
2、所有表在进行纵向追加合并时,不会按照列名来进行合并,而是按列的顺序来合并的,即第一列与第一列合并,以此类推。
3、最终返回的结果表的列名与参数中定义的第一个表的列名一致。
4、返回的结果表包含参数指定的所有表的所有行,如果存在重复行也会被保留。
5、每个列在合并的所有表中的数据类型如果不一致,那么DAX引擎会根据数据类型转换规则自动确定合适的数据类型。
6、UNION函数会尽可能保留每个列的数据沿袭,如果某个列在合并的所有表中的数据沿袭都一致,那么结果表中的这个列就会继承数据沿袭。反之,如果某个列在合并的所有表中的数据沿袭存在不一致的情况,那么结果表中的这个列就会丢失数据沿袭。因此,结果表中可能会出现某些列存在数据沿袭而某些列不存在数据沿袭的情况。
7、返回的结果表不会包含扩展表,即使参数指定的表存在扩展表。
辅助理解的例子
1、如下图所示,UNION函数将合并参数指定的所有表的所有行,并且返回的结果表的列名与参数中定义的第一个表的列名一致。
2、用作参数的所有表必须具有相同列数,否则会报错,如下图所示:
3、在多个表进行合并时,是按照列的顺序来合并的,如果列顺序不一致,那么就可能会出现同一个列中存在多个类型的数据,导致合并后的结果无意义,如下图所示:
4、合并后的结果表中,每个列的数据类型取决于合并的所有表在该列的内容,如果合并的所有内容都具有相同数据类型,那么结果表中的这个列也会保持相同的数据类型,但如果存在数据类型不一致的情况,那么DAX引擎会根据数据类型转换规则自动确定合适的数据类型。
比如下图所示的查询,由于UNION函数合并的两个表的数据类型都是数值,因此在结果表中也保持了数值类型。:
但如果将数值2的数据类型更改为文本,那么根据数据类型转换规则,数值与文本在合并后的数据类型将变成文本,如下图所示:
5、如果某个列在合并的所有表中的数据沿袭都一致,那么结果表中的这个列就会继承数据沿袭。反之,如果某个列在合并的所有表中的数据沿袭存在不一致的情况,那么结果表中的这个列就会丢失数据沿袭。
如下图所示,由于合并的两个列的数据沿袭一致,因此结果表中的该列也继承了数据沿袭,所以行上下文转换后得到的筛选器能够正常筛选。
如下图所示,破坏其中一个列的数据沿袭后,由于合并的列的数据沿袭不一致,因此结果表中的该列将丢失数据沿袭,所以行上下文转换后得到的筛选器无法正常筛选,导致整列都是总计值。
6、UNION函数返回的结果表不会包含扩展表,即使参数指定的表存在扩展表。如下图所示:
7、UNION函数由于可以追加合并数据,因此最常见的应用场景就是与表构造器语法配合来构造辅助表,比如下面所示的动态维度切换案例中要用到的辅助表:
动态维度 =
UNION(
UNION(
SELECTCOLUMNS(Customer,"Item",'Customer'[CountryRegion],"Type","地区"),
{("Others","地区")}
),
UNION(
SELECTCOLUMNS('Product',"Item",'Product'[Subcategory],"Type","产品子类"),
{("Others","产品子类")}
),
UNION(
SELECTCOLUMNS('Promotion',"Item",'Promotion'[Promotion],"Type","促销活动"),
{("Others","促销活动")}
)
)
总结
UNION函数的行为类似于数学定义上的取并集,经常用于构造辅助表等场景,使用频率很高且不可替代,建议掌握。