UNION 追加多个表或表表达式的所有行生成单个表。这些表必须具有相同数量的列,这些列按各自在表中的位置组合。第一个参数定义了结果中的列名(后续参数只添加行,不影响列名):
UNION
UNION ( <Table1>, <Table2>, [<TableN> ...] )
参数 | 属性 | 描述 |
---|---|---|
Table | 可重复 | 将被用于追加的表或表表达式 |
注意
- 表的列数必须相同。
- 列按其各自表中的位置组合。第一列与第一列组合,以此类推。
- 结果表中的列名与第一个表中的列名为准。
- 保留重复的行。
- 结果表尽可能保留列沿袭。例如,如果每个表的第一列都有映射到模型同一列 C1 的沿袭,则最终结果的第一列将具备 C1 的沿袭。但是,如果被组合的列有来自不同列的沿袭,或者有派生列,则结果中的列将失去沿袭。
- 当数据类型不同时,根据数据类型强制转换规则确定结果表的数据类型。
- 返回的表仅包含自身已有的列。因此,当结果表应用于筛选上下文时,它不涉及扩展表理论,而只筛选自身。
示例用法
结果将保留重复的行,并尽可能保留沿袭。例如,以下查询保留数据模型物理列的沿袭,因为这两个表表达式返回的列来自相同的表和相同的位置:
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] ) )
但是,如果这两行中有一行是字符串类型而不是数字,则结果是字符串类型。在下面的例子中,第二行有一个不同的列名:
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组合了几个var的结果,但结果有两个字段错位了。我有尝试把几个var拆分开来各放一个表,各个表显示的字段顺序又是一致的,但放一块组合起来就又错位了。有什么办法可以纠正过来吗?
老师好,如图所示,我改变了union_expanded度量值的值,请问为什么会得到下图中的矩阵中的结果?能不能解释一些计值顺序,感谢老师!
表的列数必须相同。
老师好,请问需要表的列名相同吗?