PowerBI/DAX之理解UNION函数

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函数的行为类似于数学定义上的取并集,经常用于构造辅助表等场景,使用频率很高且不可替代,建议掌握。

在 Power BI 中,使用 DAX 将多个表合并为一个表,可以通过多种方式实现,具体取决于合并的目的(如并集、交集、左连接、右连接等)以及数据结构的复杂程度。以下是几种常见的 DAX 方法用于合并多个表: ### 1. 使用 `UNION` 函数进行并集合并 如果多个表具有相同的列结构,并且希望将它们合并为一个包含所有行的表(类似于 SQL 中的 `UNION ALL`),可以使用 `UNION` 函数。该函数会保留重复行,若需要去重,则可以结合 `DISTINCT` 使用。 ```dax 合并表 = DISTINCT(UNION('表1', '表2')) ``` 上述代码会将 `表1` 和 `表2` 合并,并自动去除重复的行 [^2]。 ### 2. 使用 `SELECTCOLUMNS` 和 `UNION` 进行部分列合并 当多个表的列结构不一致,但希望基于某些相同字段进行合并时,可以先使用 `SELECTCOLUMNS` 统一列名和结构,再使用 `UNION` 进行合并。 ```dax 合并表 = UNION( SELECTCOLUMNS('表1', "公共列", [公共列], "值列", [值列]), SELECTCOLUMNS('表2', "公共列", [公共列], "值列", [值列]) ) ``` ### 3. 使用 `ADDCOLUMNS` 和 `CROSSJOIN` 进行笛卡尔积合并 若需要将两个表的所有行进行组合(即笛卡尔积),可以使用 `CROSSJOIN` 函数。 ```dax 笛卡尔积表 = CROSSJOIN('表1', '表2') ``` ### 4. 使用 `GENERATE` 和 `RELATEDTABLE` 进行关联表合并 当两个表之间存在关系时,可以通过 `GENERATE` 和 `RELATEDTABLE` 实现类似于 SQL 中的 `LEFT JOIN` 操作。 ```dax 左连接表 = GENERATE( '表1', RELATEDTABLE('表2') ) ``` ### 5. 使用 `NATURALINNERJOIN` 和 `NATURALLEFTOUTERJOIN` 进行自动关联 如果两个表之间有相同名称的列,可以直接使用 `NATURALINNERJOIN` 或 `NATURALLEFTOUTERJOIN` 实现自动关联。 ```dax 内连接表 = NATURALINNERJOIN('表1', '表2') ``` ```dax 左外连接表 = NATURALLEFTOUTERJOIN('表1', '表2') ``` ### 6. 使用 `DATATABLE` 构建静态表并合并 如果需要手动定义数据并与其他表合并,可以先使用 `DATATABLE` 创建静态表,再使用 `UNION` 进行合并。 ```dax 静态表 = DATATABLE("列名", STRING, "值列", INTEGER, { {"A", 1}, {"B", 2} }) 合并表 = UNION('表1', '静态表') ``` ### 7. 使用 `CALCULATETABLE` 结合 `FILTER` 进行条件筛选合并 如果需要根据某些条件筛选数据并合并,可以使用 `CALCULATETABLE` 结合 `FILTER`。 ```dax 筛选合并表 = CALCULATETABLE('表1', FILTER('表1', [条件列] > 10)) ``` ### 8. 使用 `APPEND` 函数(Power BI 新版本支持) 在 Power BI 的较新版本中,可以直接使用 `APPEND` 函数将多个表合并为一个表,类似于 `UNION`,但语法更简洁。 ```dax 合并表 = APPEND('表1', '表2') ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PowerBI | 夕枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值