SELECTCOLUMNS 从表或返回表的表达式中选择现有的列,并添加新的列,输出的每个列需要提供一个用作列名的字符串和一个标量表达式,SELECTCOLUMNS 是迭代函数,每个表达式在《Table》的行上下文中求值。
SELECTCOLUMNS
- SELECTCOLUMNS ( <Table>, <Name>, <Expression>, [<Name>, <Expression>], [ … ] )
复制代码
SELECTCOLUMNS 从表或返回表的表达式中选择现有的列,并添加新的列,输出的每个列需要提供一个用作列名的字符串和一个标量表达式,SELECTCOLUMNS 是迭代函数,每个表达式在<Table>的行上下文中求值。
参数 | 属性 | 描述 | Table | | 从中选择列的表 | Name | 可重复 | 要添加的新列的名称 | Expression | 可重复 | 要添加的新列的表达式 |
SELECTCOLUMNS 与 ADDCOLUMNS
你可以使用以下查询重写 ADDCOLUMNS 一文中的最后一个示例:
- EVALUATE
- SELECTCOLUMNS (
- Product,
- "ProductKey", Product[ProductKey],
- "Product Name", Product[Product Name],
- "Price", Product[Unit Price]
- )
- ORDER BY [ProductKey]
复制代码
结果是相同的,但有一个重要的区别:所有列都来自模型的物理列,对于 Product Name 和 Price 列都是如此,后者对应于 Unit Price,即使你更改了 SELECTCOLUMNS 输出列的名称。
SELECTCOLUMNS 与 ADDCOLUMNS 具有相同的函数签名(存储在编译器内部的名称、参数等信息),并且具有相同的行为,只不过 ADDCOLUMNS 从指定的<table>开始添加列,而 SELECTCOLUMNS 从空表开始在添加列。
关于数据沿袭
SELECTCOLUMNS 默认保留列的沿袭(Lineage)。如果执行重命名操作,只要表达式引用的是数据模型的现有列,结果就会使用相同的数据沿袭映射该列,而一旦使用任何表达式,你就失去了沿袭。你将在数据沿袭一文中看到更详细的解释。
关于命名
无论是否具有沿袭,对 SELECTCOLUMNS 定义的列的任何引用都必须使用指定给该列的准确名称。因此,如果定义列使用的是不完全限定名,则后续引用语法必须使用不加表名的列名。例如,以下语法是无效的:
- EVALUATE
- FILTER (
- SELECTCOLUMNS (
- Product,
- "ProductKey", Product[ProductKey],
- "Product Name", Product[Product Name],
- "Unit Price", Product[Unit Price]
- ),
- Product[Unit Price] > 10
- )
- ORDER BY [ProductKey]
复制代码
查询对 Product[Unit Price]的引用无效,因为 SELECTCOLUMNS 在定义此列时使用的名称是 Unit Price。值得注意的是,ORDER BY 子句使用的 ProductKey 没有这个问题,因为它引用的是没有表名的列名。你可以在筛选语句中使用不完全限定名来避免这个问题,如下面的查询所示:
- EVALUATE
- FILTER (
- SELECTCOLUMNS (
- Product,
- "ProductKey", Product[ProductKey],
- "Product Name", Product[Product Name],
- "Unit Price", Product[Unit Price]
- ),
- [Unit Price] > 10
- )
- ORDER BY [ProductKey]
复制代码
你也可以在 SELECTCOLUMNS 中使用完全限定名,以便在后续引用中保持相同的语法,如下一个示例中所示:
- EVALUATE
- FILTER (
- SELECTCOLUMNS (
- Product,
- "Product[ProductKey]", Product[ProductKey],
- "Product[Product Name]", Product[Product Name],
- "Product[Unit Price]", Product[Unit Price]
- ),
- Product[Unit Price] > 10
- )
- ORDER BY [ProductKey]
复制代码
即使为每个列定义了完全限定的名称,仍然可以在引用列时仅使用列名,就像示例中 ORDER BY 引用 ProductKey 列一样。这种语法是有效的,除非在最终结果中有两个列具有相同的列名和不同的表名(在这种情况下,会产生歧义而提示引用错误)。
你还可以使用 SELECTCOLUMNS 添加新列,执行类似 ADDCOLUMNS 函数的操作。区别在于,必须显式引用结果中包含的每一列,而不是直接向当前表添加新列。例如,下面的查询返回每个产品类别的子类别对应的产品数量,只显示类别名称,不显示产品类别表中的其他列:
- EVALUATE
- SELECTCOLUMNS (
- 'Product Category',
- "Category Name", 'Product Category'[Category],
- "Subcategories", CALCULATE (
- COUNTROWS ( 'Product Subcategory' )
- ),
- "Products", CALCULATE (
- COUNTROWS ( Product )
- )
- )
复制代码
结果将 Category Name 列映射到模型产品类别表的 Category 列(保持了沿袭),并添加两个以斜体突出显示的计算列,因为它们与物理列没有映射关系。
|