[知识体系] 理解 ADDCOLUMNS

  [复制链接]
查看119092 | 回复125 | 2021-2-21 18:52:38 | 显示全部楼层 |阅读模式
ADDCOLUMNS 返回包含原始列和所有新添加列的表。由于新列使用的标量表达式沿着第一参数的每行计值,所以 ADDCOLUMNS 也是迭代函数


例如,你可以使用以下语法添加两列,计算每个产品类别下的子类别数量和产品的数量:
  1. EVALUATE
  2. ADDCOLUMNS (
  3.     'Product Category',
  4.     "Subcategories", CALCULATE ( COUNTROWS ( 'Product Subcategory' ) ),
  5.     "Products", CALCULATE ( COUNTROWS ( Product ) )
  6. )
复制代码

结果包括产品类别表中的列和由 ADDCOLUMNS 迭代计算的列。你可以看到这些新列以斜体突出显示。



7075211936381.jpeg



稍后你将看到原生列派生列(上图中以斜体显示)重要区别。斜体显示的列无法映射模型中物理列的沿袭Lineage),并且你不能在筛选上下文中使用它们,我们将在 DAX 高级原理的“理解沿袭”一文中做更详细地描述。


仔细观察上面的查询,你会发现两个派生列的公式都使用了 CALCULATE,它的作用是激活上下文转换,将 ADDCOLUMNS 创建的行上下文转换筛选上下文。如果去掉 CALCULATE,查询将无法得到预期的结果


7075211936382.png

移除 CALCULATE 后,每行返回相同的结果
使用 SUMMARIZE 计算派生列可以省略 CALCULATE,因为 SUMMARIZE 既有行上下文,也有筛选上下文,而 ADDCOLUMNS 仅提供行上下文。但是出于性能考虑,建议你始终用 ADDCOLUMNS 添加派生列
迭代函数

ADDCOLUMNS 是一个迭代函数,它创建行上下文,在表的每一行计算用于添加列的表达式。换句话说,ADDCOLUMNS 为你提供了和计算列相同的语义,但是计算的结果属于本地查询的缓存,而不是数据模型中的持久结果。也因为这个原因,你可以调用其他迭代函数(例如 FILTER 或其他 ADDCOLUMNS)获取 ADDCOLUMNS 的新列中的结果,但不能在 CALCULATE 或 CALCULATETABLE 中将这些列用作筛选器参数。


例如,通过对 ADDCOLUMNS 调用 FILTER 函数,你可以筛选出至少有 500 个产品的类别,如下面的示例所示:
  1. EVALUATE
  2. FILTER (
  3.     ADDCOLUMNS (
  4.         'Product Category',
  5.         "Subcategories", CALCULATE ( COUNTROWS ( 'Product Subcategory' ) ),
  6.         "Products", CALCULATE ( COUNTROWS ( Product ) )
  7.     ),
  8.     [Products] > 500
  9. )
复制代码

这一次的结果只包含很少的行



7075211936383.jpeg





使用 ADDCOLUMNS 代替 SELECTCOLUMNS



如果你需要从表中选出列的子集,可以使用 SELECTCOLUMNS,下一篇文章将介绍此函数。不过,旧版的 DAX 没有 SELECTCOLUMNS 函数,只能使用 ADDCOLUMNS 来获得需要的结果。在这种情况下,第一参数应该只包含一个或多个列,目的是标识表的唯一行,然后添加所需的列。例如,如果你希望从产品表中获得一个只有三列的表:ProductKey, Product Name 和 Unit Price,可以使用以下查询:
  1. EVALUATE
  2. ADDCOLUMNS (
  3.     DISTINCT ( Product[ProductKey] ),
  4.     "Product Name", CALCULATE ( VALUES ( Product[Product Name] ) ),
  5.     "Price", CALCULATE ( VALUES ( Product[Unit Price] ) )
  6. )
复制代码

请注意,结果里只有 ProductKey 列映射到物理表,其他两列是派生列(以斜体显示)。派生列在筛选上下文中存在重要的限制:你不能通过筛选上下文筛选派生列。为了避免这种情况,最好尽可能使用 SELECTCOLUMNS 来选择和创建需要在结果中投影的列。



7075211936384.jpeg
回复

使用道具 举报

sibada | 2021-4-24 13:15:11 | 显示全部楼层
广告位,,坐下看看
回复

使用道具 举报

2138688 | 2021-5-21 06:24:54 来自手机 | 显示全部楼层
确实不错,顶先
回复

使用道具 举报

yankai | 2021-8-17 17:26:30 来自手机 | 显示全部楼层
支持,一直很喜欢老师的课程
回复

使用道具 举报

weimei | 2021-10-18 23:57:51 来自手机 | 显示全部楼层
回个帖子,下班咯~
回复

使用道具 举报

arhat | 2021-10-23 10:26:35 来自手机 | 显示全部楼层
支持支持再支持
回复

使用道具 举报

诗诺 | 2021-10-24 09:17:32 来自手机 | 显示全部楼层
努力~~各位。。。
回复

使用道具 举报

kgbmmmm | 2021-10-27 18:49:05 | 显示全部楼层
支持,楼下的跟上哈~
回复

使用道具 举报

死性不改 | 2021-10-31 13:01:07 来自手机 | 显示全部楼层
呵呵。。。.....
回复

使用道具 举报

lwfeng | 2021-11-11 07:11:48 | 显示全部楼层
我只是路过,不发表意见
回复

使用道具 举报

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

本版积分规则