ADDCOLUMNS 返回包含原始列和所有新添加列的表。由于新列使用的标量表达式沿着第一参数的每行计值,所以 ADDCOLUMNS 也是迭代函数。
例如,你可以使用以下语法添加两列,计算每个产品类别下的子类别数量和产品的数量:
- EVALUATE
- ADDCOLUMNS (
- 'Product Category',
- "Subcategories", CALCULATE ( COUNTROWS ( 'Product Subcategory' ) ),
- "Products", CALCULATE ( COUNTROWS ( Product ) )
- )
复制代码
结果包括产品类别表中的列和由 ADDCOLUMNS 迭代计算的列。你可以看到这些新列以斜体突出显示。
稍后你将看到原生列和派生列(上图中以斜体显示)重要区别。斜体显示的列无法映射模型中物理列的沿袭(Lineage),并且你不能在筛选上下文中使用它们,我们将在 DAX 高级原理的“理解沿袭”一文中做更详细地描述。
仔细观察上面的查询,你会发现两个派生列的公式都使用了 CALCULATE,它的作用是激活上下文转换,将 ADDCOLUMNS 创建的行上下文转换为筛选上下文。如果去掉 CALCULATE,查询将无法得到预期的结果
移除 CALCULATE 后,每行返回相同的结果
迭代函数
ADDCOLUMNS 是一个迭代函数,它创建行上下文,在表的每一行计算用于添加列的表达式。换句话说,ADDCOLUMNS 为你提供了和计算列相同的语义,但是计算的结果属于本地查询的缓存,而不是数据模型中的持久结果。也因为这个原因,你可以调用其他迭代函数(例如 FILTER 或其他 ADDCOLUMNS)获取 ADDCOLUMNS 的新列中的结果,但不能在 CALCULATE 或 CALCULATETABLE 中将这些列用作筛选器参数。
例如,通过对 ADDCOLUMNS 调用 FILTER 函数,你可以筛选出至少有 500 个产品的类别,如下面的示例所示:
- EVALUATE
- FILTER (
- ADDCOLUMNS (
- 'Product Category',
- "Subcategories", CALCULATE ( COUNTROWS ( 'Product Subcategory' ) ),
- "Products", CALCULATE ( COUNTROWS ( Product ) )
- ),
- [Products] > 500
- )
复制代码
这一次的结果只包含很少的行
使用 ADDCOLUMNS 代替 SELECTCOLUMNS
如果你需要从表中选出列的子集,可以使用 SELECTCOLUMNS,下一篇文章将介绍此函数。不过,旧版的 DAX 没有 SELECTCOLUMNS 函数,只能使用 ADDCOLUMNS 来获得需要的结果。在这种情况下,第一参数应该只包含一个或多个列,目的是标识表的唯一行,然后添加所需的列。例如,如果你希望从产品表中获得一个只有三列的表:ProductKey, Product Name 和 Unit Price,可以使用以下查询:
- EVALUATE
- ADDCOLUMNS (
- DISTINCT ( Product[ProductKey] ),
- "Product Name", CALCULATE ( VALUES ( Product[Product Name] ) ),
- "Price", CALCULATE ( VALUES ( Product[Unit Price] ) )
- )
复制代码
请注意,结果里只有 ProductKey 列映射到物理表,其他两列是派生列(以斜体显示)。派生列在筛选上下文中存在重要的限制:你不能通过筛选上下文筛选派生列。为了避免这种情况,最好尽可能使用 SELECTCOLUMNS 来选择和创建需要在结果中投影的列。
|