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] )
- )
复制代码
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 结果不适用于扩展表理论
|