[知识体系] 理解 SELECTCOLUMNS

  [复制链接]
查看92848 | 回复110 | 2021-2-21 18:52:29 | 显示全部楼层 |阅读模式
SELECTCOLUMNS 从表或返回表的表达式中选择现有的列,并添加新的列,输出的每个列需要提供一个用作列名的字符串和一个标量表达式,SELECTCOLUMNS迭代函数,每个表达式在《Table》的行上下文中求值。
SELECTCOLUMNS
  1. SELECTCOLUMNS ( <Table>, <Name>, <Expression>, [<Name>, <Expression>], [ … ] )
复制代码


SELECTCOLUMNS 从表或返回表的表达式中选择现有的列,并添加新的列,输出的每个列需要提供一个用作列名的字符串和一个标量表达式,SELECTCOLUMNS迭代函数,每个表达式在<Table>的行上下文中求值。

参数属性描述
Table从中选择列的表
Name可重复要添加的新列的名称
Expression可重复要添加的新列的表达式

SELECTCOLUMNS 不能在早期的 DAX 引擎中使用

SELECTCOLUMNS 与 ADDCOLUMNS


你可以使用以下查询重写 ADDCOLUMNS 一文中的最后一个示例:

  1. EVALUATE
  2. SELECTCOLUMNS (
  3.     Product,
  4.     "ProductKey", Product[ProductKey],
  5.     "Product Name", Product[Product Name],
  6.     "Price", Product[Unit Price]
  7. )
  8. ORDER BY [ProductKey]
复制代码


结果是相同的,但有一个重要的区别:所有列都来自模型的物理列,对于 Product Name 和 Price 列都是如此,后者对应于 Unit Price,即使你更改了 SELECTCOLUMNS 输出列的名称。


SELECTCOLUMNS 与 ADDCOLUMNS 具有相同的函数签名(存储在编译器内部的名称、参数等信息),并且具有相同的行为,只不过 ADDCOLUMNS 从指定的<table>开始添加列,而 SELECTCOLUMNS 从空表开始在添加列。

关于数据沿袭

SELECTCOLUMNS 默认保留列的沿袭Lineage)。如果执行重命名操作,只要表达式引用的是数据模型的现有列,结果就会使用相同的数据沿袭映射该列,而一旦使用任何表达式,你就失去了沿袭。你将在数据沿袭一文中看到更详细的解释。

关于命名

无论是否具有沿袭,对 SELECTCOLUMNS 定义的列的任何引用都必须使用指定给该列的准确名称。因此,如果定义列使用的是不完全限定名,则后续引用语法必须使用不加表名的列名。例如,以下语法是无效的:

  1. EVALUATE
  2. FILTER (
  3.     SELECTCOLUMNS (
  4.         Product,
  5.         "ProductKey", Product[ProductKey],
  6.         "Product Name", Product[Product Name],
  7.         "Unit Price", Product[Unit Price]
  8.     ),
  9.     Product[Unit Price] > 10
  10. )
  11. ORDER BY [ProductKey]
复制代码


查询对 Product[Unit Price]的引用无效,因为 SELECTCOLUMNS 在定义此列时使用的名称是 Unit Price。值得注意的是,ORDER BY 子句使用的 ProductKey 没有这个问题,因为它引用的是没有表名的列名。你可以在筛选语句中使用不完全限定名来避免这个问题,如下面的查询所示:

  1. EVALUATE
  2. FILTER (
  3.     SELECTCOLUMNS (
  4.         Product,
  5.         "ProductKey", Product[ProductKey],
  6.         "Product Name", Product[Product Name],
  7.         "Unit Price", Product[Unit Price]
  8.     ),
  9.     [Unit Price] > 10
  10. )
  11. ORDER BY [ProductKey]
复制代码


你也可以在 SELECTCOLUMNS 中使用完全限定名,以便在后续引用中保持相同的语法,如下一个示例中所示:

  1. EVALUATE
  2. FILTER (
  3.     SELECTCOLUMNS (
  4.         Product,
  5.         "Product[ProductKey]", Product[ProductKey],
  6.         "Product[Product Name]", Product[Product Name],
  7.         "Product[Unit Price]", Product[Unit Price]
  8.     ),
  9.     Product[Unit Price] > 10
  10. )
  11. ORDER BY [ProductKey]
复制代码


即使为每个列定义了完全限定的名称,仍然可以在引用列时仅使用列名,就像示例中 ORDER BY 引用 ProductKey 列一样。这种语法是有效的,除非在最终结果中有两个列具有相同的列名和不同的表名(在这种情况下,会产生歧义而提示引用错误)。


你还可以使用 SELECTCOLUMNS 添加新列,执行类似 ADDCOLUMNS 函数的操作。区别在于,必须显式引用结果中包含的每一列,而不是直接向当前表添加新列。例如,下面的查询返回每个产品类别的子类别对应的产品数量,只显示类别名称,不显示产品类别表中的其他列:

  1. EVALUATE
  2. SELECTCOLUMNS (
  3.     'Product Category',
  4.     "Category Name", 'Product Category'[Category],
  5.     "Subcategories", CALCULATE (
  6.         COUNTROWS ( 'Product Subcategory' )
  7.     ),
  8.     "Products", CALCULATE (
  9.         COUNTROWS ( Product )
  10.     )
  11. )
复制代码


结果将 Category Name 列映射到模型产品类别表的 Category 列(保持了沿袭),并添加两个以斜体突出显示的计算列,因为它们与物理列没有映射关系。



7074211936381.png
回复

使用道具 举报

kato | 2021-4-24 13:14:36 | 显示全部楼层
支持楼主,用户楼主,楼主英明呀!!!
回复

使用道具 举报

mdqzj | 2021-5-20 06:58:13 来自手机 | 显示全部楼层
小白一个 顶一下
回复

使用道具 举报

sywzmin | 2021-6-11 07:42:10 | 显示全部楼层
我也来支持一下,这里的老师和其他机构不一样,其他就是让付费。
回复

使用道具 举报

3iii | 2021-6-13 10:55:25 | 显示全部楼层
为毛老子总也抢不到沙发?!!
回复

使用道具 举报

嘉明 | 2021-7-20 22:50:58 | 显示全部楼层
有空大家一起交流一下
回复

使用道具 举报

lrb079 | 2021-9-22 07:16:21 | 显示全部楼层
锄禾日当午,发帖真辛苦。谁知坛中餐,帖帖皆辛苦!
回复

使用道具 举报

idol77 | 2021-11-1 22:50:34 来自手机 | 显示全部楼层
不错 支持下
回复

使用道具 举报

drylu | 2021-11-8 22:29:38 来自手机 | 显示全部楼层
这么强,支持楼主,佩服
回复

使用道具 举报

招鹏 | 2021-11-16 20:30:14 | 显示全部楼层
前排支持下了哦~
回复

使用道具 举报

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

本版积分规则