PowerBI/DAX之理解ADDCOLUMNS函数

ADDCOLUMNS函数是一个表函数,同时也是迭代函数,它会像计算列一样,迭代表的每一行并计算所给的表达式,最后给表添加一个新列。


语法和作用

语法:

ADDCOLUMNS(table_expression, name, expression[, name, expression]…)

作用:给第一参数指定的表添加派生列,派生列将在第一参数的表提供的行上下文和外部计值上下文中进行计算,最终返回包含第一参数的表的所有列和新添加的派生列的新表。

注意:添加的派生列不存在数据沿袭,也就是不能用于筛选。此外,如果第一参数所指定的表包含扩展表,那么ADDCOLUMNS函数返回的新表也会包含该扩展表,但扩展表上的列不可见。


辅助理解的例子

1、给指定的表添加新列,如下图所示:

注意,由于派生列将在ADDCOLUMNS函数的第一参数的表提供的行上下文和外部计值上下文中进行计算,因此上面的派生列中需要添加CALCULATE函数来进行行上下文转换,才可以计算得到每一行所对应的产品的数。如果去掉CALCULATE函数,则由于不存在任何筛选器,那么订单表的可见数据为所有数据,最终派生列整列都会返回全部销售额或数量的总计,如下图所示:

2、ADDCOLUMNS函数的第一参数的表可以是返回表的表函数,如果直接使用基础表,那么是含有该基础表的扩展表的,因此在派生列中可以使用存在扩展表时才能使用的函数,比如RELATED函数等,另外其返回的结果也会含有扩展表。具体如下图所示:

3、ADDCOLUMNS函数添加的派生列并不会永久保存在模型中,它只在当前度量值或查询等对象的计算中临时存在。另外由于派生列的计值环境包括外部计值环境,所以派生列的计算其实是动态的,可以根据外部计值环境的变化而变化,比如切片器的改变等。比如下图所示的,可以动态汇总切片器未选择的产品的销量:

注意:ADDCOLUMNS函数添加的派生列只能使用非限定性的列引用。

4、ADDCOLUMNS函数中添加的任何派生列都是不具有数据沿袭的,即使是直接的列引用,如下图所示:

其中使用了SELECTCOLUMNS函数去提取ADDCOLUMNS函数添加的派生列,然后SELECTCOLUMNS函数中是直接引用列的,因此会继承数据沿袭,但是由于ADDCOLUMNS函数添加的所有派生列都是无数据沿袭的,也就是说源头本身就无数据沿袭,因此后边继承得到的也是无数据沿袭,所以行上下文转换后得到的筛选器无法筛选模型中的数据,最终返回了总销售额。


总结

ADDCOLUMNS函数可以像计算列那样,给指定的表添加新的派生列,并且可以根据外部计值环境进行动态计算,是使用频率非常高的一个函数,建议掌握。

### 高级 DAX 函数示例及应用场景 #### 1. 时间智能函数 时间智能函数DAX 的核心功能之一,用于处理日期和时间维度的数据分析。这些函数可以帮助用户计算同比、环比以及其他基于时间的趋势。 - **TOTALYTD**: 计算某个度量值在当年累计的结果。 ```dax TotalSalesYTD = TOTALYTD(SUM('Sales'[Amount]), 'Date'[Date]) ``` 这里的 `SUM('Sales'[Amount])` 是要累加的销售额,而 `'Date'[Date]` 定义了时间范围[^1]。 - **PARALLELPERIOD**: 返回相对于当前周期前若干个周期的时间间隔数据。 ```dax PreviousYearSales = CALCULATE( SUM('Sales'[Amount]), PARALLELPERIOD('Date'[Date], -1, YEAR) ) ``` #### 2. 上下文转换函数 DAX 提供了一些专门用于上下文转换的功能,帮助解决复杂的多维数据分析问题。 - **CALCULATE 和 FILTER 结合使用** 使用 `CALCULATE` 可以改变筛选器上下文,从而实现更灵活的条件过滤。 ```dax HighValueCustomers = CALCULATE( COUNTROWS('Customer'), FILTER('Customer', 'Customer'[TotalSpent] > 1000) ) ``` 此处定义了一个新的客户群体——总消费金额超过 1000 的高价值客户[^4]。 #### 3. 表达式生成动态表格 利用 DAX 创建虚拟表可以极大地增强模型的表现力。 - **ADDCOLUMNS 和 GENERATE 组合** 动态添加新列并结合现有数据集进行扩展。 ```dax EnhancedTable = ADDCOLUMNS( 'Product', "ProfitMargin", DIVIDE([Sales] - [Cost], [Sales]) ) ``` #### 4. 条件逻辑与错误处理 为了应对复杂业务场景下的异常情况,DAX 支持 IF/ELSE 构造以及内置的安全除法运算符。 - **SWITCH 替代多重嵌套 IF** 当存在多个分支判断时,推荐采用 SWITCH 更清晰地表达意图。 ```dax CategoryLabel = SWITCH(TRUE(), [Revenue] >= 1000000, "High", [Revenue] >= 500000, "Medium", "Low" ) ``` #### 应用场景总结 上述提到的各种高级技术广泛应用于财务报表制作、销售业绩评估等领域,在实际工作中能够显著提升工作效率和决策支持能力[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PowerBI | 夕枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值