[知识体系] 理解 UNION

  [复制链接]
查看212822 | 回复167 | 2021-2-21 18:51:05 | 显示全部楼层 |阅读模式
UNION 追加多个表或表表达式的所有行生成单个表。这些表必须具有相同数量的列,这些列按各自在表中的位置组合。第一个参数定义了结果中的列名(后续参数只添加行,不影响列名):

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

注意


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

示例用法

结果将保留重复的行,并尽可能保留沿袭。例如,以下查询保留数据模型物理列的沿袭,因为这两个表表达式返回的列来自相同的表和相同的位置:
  1. EVALUATE
  2. UNION (
  3.     FILTER (
  4.         'Product Subcategory',
  5.         'Product Subcategory'[ProductCategoryKey] = 6
  6.     ),
  7.     FILTER (
  8.         'Product Subcategory',
  9.         'Product Subcategory'[Subcategory Code] = "0602"
  10.             || 'Product Subcategory'[Subcategory Code] = "0702"
  11.     )
  12. )
复制代码

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



7063211941531.jpeg



UNION 的结果用于筛选上下文时,沿袭很重要。例如,以下查询返回至少包含一个由 UNION 函数生成的子类别的所有产品类别列表,该函数将具有不同列名(Code 1 和 Code 2)且具有相同沿袭的两个表合并:
  1. EVALUATE
  2. CALCULATETABLE (
  3.     'Product Subcategory',
  4.     UNION (
  5.         CALCULATETABLE (
  6.             SELECTCOLUMNS (
  7.                 'Product Subcategory',
  8.                 "Code 1", 'Product Subcategory'[Subcategory Code]
  9.             ),
  10.             'Product Subcategory'[Subcategory Code] = "0601"
  11.                 || 'Product Subcategory'[Subcategory Code] = "0602"
  12.         ),
  13.         CALCULATETABLE (
  14.             SELECTCOLUMNS (
  15.                 'Product Subcategory',
  16.                 "Code 2", 'Product Subcategory'[Subcategory Code]
  17.             ),
  18.             'Product Subcategory'[Subcategory Code] = "0702"
  19.         )
  20.     )
  21. )
复制代码


7063211941532.png



如果添加失去沿袭的表作为参数,结果将不再筛选原始列。例如,下面的例子使用的 UNION 函数返回与上一个表达式相同的子类别代码列表(0601、0602 和 0702),但是 UNION 的第二参数使用的 ROW 失去了原始列的沿袭:
  1. EVALUATE
  2. CALCULATETABLE (
  3.     'Product Subcategory',
  4.     UNION (
  5.         CALCULATETABLE (
  6.             SELECTCOLUMNS (
  7.                 'Product Subcategory',
  8.                 "Code 1", 'Product Subcategory'[Subcategory Code]
  9.             ),
  10.             'Product Subcategory'[ProductCategoryKey] = 6
  11.         ),
  12.         ROW ( "Code 2", "0702" )
  13.     )
  14. )
复制代码

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



7063211941533.png



结果中列的数据类型取决于 UNION 合并的所有表的内容,最终使用的是支持隐式转换,而且不会出现任何错误的数据类型。以下查询将两行合并为整数值:
  1. EVALUATE
  2. ADDCOLUMNS (
  3.     UNION ( ROW ( "Value", 1 ), ROW ( "Value", 2 ) ),
  4.     "IsText", ISTEXT ( [Value] ),
  5.     "IsNumber", ISNUMBER ( [Value] )
  6. )
复制代码

7063211941534.jpeg

Value 列的值使用了数值类型


但是,如果这两行中有一行是字符串类型而不是数字,则结果是字符串类型。在下面的例子中,第二行有一个不同的列名:
  1. EVALUATE
  2. ADDCOLUMNS (
  3.     UNION (
  4.         ROW ( "Value", 1 ),
  5.         ROW ( "AnotherName", "2" )
  6.     ),
  7.     "IsText", ISTEXT ( [Value] ),
  8.     "IsNumber", ISNUMBER ( [Value] )
  9. )
复制代码


7063211941535.jpeg



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

不适用扩展表

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



7063211941536.png

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

  2. union_expanded =
  3. CALCULATE (
  4.     SUM ( 'One side'[c4] ),
  5.     UNION (
  6.         FILTER ( ALL ( 'Many side' ), 'Many side'[c2] = 10 ),
  7.         FILTER ( ALL ( 'Many side' ), 'Many side'[c2] = 40 )
  8.     )
  9. )
复制代码

7063211941537.png

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

使用道具 举报

车王Alex | 2021-4-24 12:57:41 | 显示全部楼层
广告位,,坐下看看
回复

使用道具 举报

van | 2021-7-19 22:20:35 | 显示全部楼层
呵呵,明白了
回复

使用道具 举报

彬彬有礼 | 2021-9-23 11:21:57 来自手机 | 显示全部楼层
有空大家一起交流一下
回复

使用道具 举报

车头灯 | 2021-10-5 07:46:23 | 显示全部楼层
广告位,,坐下看看
回复

使用道具 举报

jacky0752 | 2021-11-8 16:33:04 | 显示全部楼层
不错不错.,..我一直很喜欢
回复

使用道具 举报

wutiwen | 2021-11-17 13:59:52 来自手机 | 显示全部楼层
这个不错,学习了
回复

使用道具 举报

一轮不转 | 2021-11-29 13:12:40 | 显示全部楼层
看起来好像不错的样子
回复

使用道具 举报

fwd | 2021-12-6 20:24:17 来自手机 | 显示全部楼层
努力~~各位。。。
回复

使用道具 举报

drylu | 2022-1-29 12:57:53 | 显示全部楼层
不错 支持一个了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则