从数据到信息
从信息到洞察

ADDCOLUMNS

顾名思义,ADDCOLUMNS 函数的作用是为表添加新的列,新增的每一列需要指定名称和对应的标量表达式。

ADDCOLUMNS

ADDCOLUMNS (<table>, <column_name1>, <column_expression1>, [<column_name2>, <column_expression2>] ...)

ADDCOLUMNS 返回包含原始列和所有新添加列的表。由于新列使用的标量表达式沿着第一参数的每行计值,所以 ADDCOLUMNS 也是迭代函数

参数 属性 描述
Table 用来添加新列的表
Name 可重复 要添加的新列的名称
Expression 可重复 要添加的新列的表达式

例如,你可以使用以下语法添加两列,计算每个产品类别下的子类别数量和产品的数量:

EVALUATE
ADDCOLUMNS (
    'Product Category',
    "Subcategories", CALCULATE ( COUNTROWS ( 'Product Subcategory' ) ),
    "Products", CALCULATE ( COUNTROWS ( Product ) )
)

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

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

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

移除 CALCULATE 后,每行返回相同的结果

使用 SUMMARIZE 计算派生列可以省略 CALCULATE,因为 SUMMARIZE 既有行上下文,也有筛选上下文,而 ADDCOLUMNS 仅提供行上下文。但是出于性能考虑,建议你始终用 ADDCOLUMNS 添加派生列

迭代函数

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 来选择和创建需要在结果中投影的列。

 

说点什么

avatar
1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
  订阅本文评论  
提醒
DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数