从数据到信息
从信息到洞察

理解 UNION

UNION 追加多个表或表表达式的所有行生成单个表。这些表必须具有相同数量的列,这些列按各自在表中的位置组合。第一个参数定义了结果中的列名(后续参数只添加行,不影响列名):

UNION

UNION ( <Table1>, <Table2>, [<TableN> ...] )
参数 属性 描述
Table 可重复 将被用于追加的表或表表达式

注意

  1. 表的列数必须相同。
  2. 列按其各自表中的位置组合。第一列与第一列组合,以此类推。
  3. 结果表中的列名与第一个表中的列名为准。
  4. 保留重复的行。
  5. 结果表尽可能保留列沿袭。例如,如果每个表的第一列都有映射到模型同一列 C1 的沿袭,则最终结果的第一列将具备 C1 的沿袭。但是,如果被组合的列有来自不同列的沿袭,或者有派生列,则结果中的列将失去沿袭。
  6. 当数据类型不同时,根据数据类型强制转换规则确定结果表的数据类型。
  7. 返回的表仅包含自身已有的列。因此,当结果表应用于筛选上下文时,它不涉及扩展表理论,而只筛选自身。

示例用法

结果将保留重复的行,并尽可能保留沿袭。例如,以下查询保留数据模型物理列的沿袭,因为这两个表表达式返回的列来自相同的表和相同的位置:

EVALUATE
UNION (
    FILTER (
        'Product Subcategory',
        'Product Subcategory'[ProductCategoryKey] = 6
    ),
    FILTER (
        'Product Subcategory',
        'Product Subcategory'[Subcategory Code] = "0602"
            || 'Product Subcategory'[Subcategory Code] = "0702"
    )
)

查询生成两个重复的行,在下面的结果中突出显示。

UNION 的结果用于筛选上下文时,沿袭很重要。例如,以下查询返回至少包含一个由 UNION 函数生成的子类别的所有产品类别列表,该函数将具有不同列名(Code 1 和 Code 2)且具有相同沿袭的两个表合并:

EVALUATE
CALCULATETABLE (
    'Product Subcategory',
    UNION (
        CALCULATETABLE (
            SELECTCOLUMNS (
                'Product Subcategory',
                "Code 1", 'Product Subcategory'[Subcategory Code]
            ),
            'Product Subcategory'[Subcategory Code] = "0601"
                || 'Product Subcategory'[Subcategory Code] = "0602"
        ),
        CALCULATETABLE (
            SELECTCOLUMNS (
                'Product Subcategory',
                "Code 2", 'Product Subcategory'[Subcategory Code]
            ),
            'Product Subcategory'[Subcategory Code] = "0702"
        )
    )
) 

如果添加失去沿袭的表作为参数,结果将不再筛选原始列。例如,下面的例子使用的 UNION 函数返回与上一个表达式相同的子类别代码列表(0601、0602 和 0702),但是 UNION 的第二参数使用的 ROW 失去了原始列的沿袭:

EVALUATE
CALCULATETABLE (
    'Product Subcategory',
    UNION (
        CALCULATETABLE (
            SELECTCOLUMNS (
                'Product Subcategory',
                "Code 1", 'Product Subcategory'[Subcategory Code]
            ),
            'Product Subcategory'[ProductCategoryKey] = 6
        ),
        ROW ( "Code 2", "0702" )
    )
)

结果返回了所有类别,因为 UNION 的结果不会影响筛选上下文

结果中列的数据类型取决于 UNION 合并的所有表的内容,最终使用的是支持隐式转换,而且不会出现任何错误的数据类型。以下查询将两行合并为整数值:

EVALUATE
ADDCOLUMNS (
    UNION ( ROW ( "Value", 1 ), ROW ( "Value", 2 ) ),
    "IsText", ISTEXT ( [Value] ),
    "IsNumber", ISNUMBER ( [Value] )
)

Value 列的值使用了数值类型

但是,如果这两行中有一行是字符串类型而不是数字,则结果是字符串类型。在下面的例子中,第二行有一个不同的列名:

EVALUATE
ADDCOLUMNS (
    UNION (
        ROW ( "Value", 1 ),
        ROW ( "AnotherName", "2" )
    ),
    "IsText", ISTEXT ( [Value] ),
    "IsNumber", ISNUMBER ( [Value] ) 
)

列名(Value)仅取决于 UNION 的第一参数,而数据类型则取决于所有行的内容。

不适用扩展表

UNION 的结果不适用扩展表理论,即使结果表具备数据沿袭,你也无法将其作为筛选上下文筛选关系一端的表。例如,下面的查询中,expanded 度量值可以正常计值,但是 union_expanded 无法应用扩展表

expanded = CALCULATE(SUM('One side'[c4]),'Many side')

union_expanded =
CALCULATE (
    SUM ( 'One side'[c4] ),
    UNION (
        FILTER ( ALL ( 'Many side' ), 'Many side'[c2] = 10 ),
        FILTER ( ALL ( 'Many side' ), 'Many side'[c2] = 40 )
    )
)

UNION 结果不适用于扩展表理论

这是一种特殊情形,与 UNION 类似的还有 INTERSECTEXCEPT,它们在筛选上下文中仅筛选自身包含的列,不涉及扩展表

8
说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
3 评论数
5 被回复的评论
4 订阅评论的人数
 
查看最近回复
查看最热评论
  订阅本文评论  
最新 最旧 得票最多
提醒
游客
LUNA

老师,我用union组合了几个var的结果,但结果有两个字段错位了。我有尝试把几个var拆分开来各放一个表,各个表显示的字段顺序又是一致的,但放一块组合起来就又错位了。有什么办法可以纠正过来吗?

成员
139****1346

老师好,如图所示,我改变了union_expanded度量值的值,请问为什么会得到下图中的矩阵中的结果?能不能解释一些计值顺序,感谢老师!

result.PNG
成员
做一名学霸

表的列数必须相同。

老师好,请问需要表的列名相同吗?

DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数