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函数在Power BI中的应用 Power BI 是一个强大的商业智能工具,而 DAX(Data Analysis Expressions)则是 Power BI 中用于数据分析的核心技术之一。DAX 不仅支持复杂的计算和数据建模,还能够通过其丰富的函数库实现各种高级分析需求。 #### 1. **DAX的主要功能** DAX 主要用于查询和计算,特别是在 Power BI 的数据模型中,DAX 可以帮助用户从现有的数据中提取有用的信息。DAX 查询函数可以筛选出有用的数据集合,然后利用 DAX 的聚合函数执行计算。这些计算可以是简单的求和、平均值,也可以是更复杂的逻辑判断和条件计算。 #### 2. **DAX函数的分类** DAX 函数可以分为多个类别,主要包括: - **聚合函数**:用于对数据进行汇总计算。例如 `SUM`、`AVERAGE`、`COUNT` 等。 - **逻辑函数**:用于实现条件判断和逻辑控制。例如 `IF`、`SWITCH` 等。 - **时间智能函数**:用于处理与时间相关的计算。例如 `TOTALYTD`、`SAMEPERIODLASTYEAR` 等。 - **表函数**:用于生成新的表或修改现有的表。例如 `FILTER`、`ADDCOLUMNS` 等。 - **文本函数**:用于处理字符串数据。例如 `LEFT`、`RIGHT`、`MID` 等。 - **日期和时间函数**:用于处理日期和时间数据。例如 `TODAY`、`DATE` 等。 #### 3. **常见的DAX函数及其用法** ##### **聚合函数** - **SUM**:对某个列中的所有数值求和。 ```dax TotalSales = SUM('Sales'[Amount]) ``` - **AVERAGE**:返回列中所有数字的平均值。 ```dax AverageSales = AVERAGE('Sales'[Amount]) ``` - **COUNT**:计算指定列中包含非空值的行数。 ```dax NumberOfOrders = COUNT('Orders'[OrderID]) ``` - **DISTINCTCOUNT**:对列中的非重复值数目进行计数。 ```dax UniqueCustomers = DISTINCTCOUNT('Customers'[CustomerID]) ``` ##### **逻辑函数** - **IF**:根据条件返回不同的结果。 ```dax SalesStatus = IF(SUM('Sales'[Amount]) > 10000, "High", "Low") ``` - **SWITCH**:根据表达式的值返回不同的结果。 ```dax ProductCategory = SWITCH(TRUE(), 'Products'[Category] = "Electronics", "Electronics", 'Products'[Category] = "Clothing", "Clothing", "Other" ) ``` ##### **时间智能函数** - **TOTALYTD**:计算年度至今的累计值。 ```dax YTD Sales = TOTALYTD(SUM('Sales'[Amount]), 'Date'[Date]) ``` - **SAMEPERIODLASTYEAR**:计算去年同期的值。 ```dax LastYearSales = CALCULATE(SUM('Sales'[Amount]), SAMEPERIODLASTYEAR('Date'[Date])) ``` ##### **表函数** - **FILTER**:根据条件筛选表中的数据。 ```dax HighValueOrders = FILTER('Orders', 'Orders'[Amount] > 1000) ``` - **ADDCOLUMNS**:向表中添加新的列。 ```dax OrdersWithDiscount = ADDCOLUMNS('Orders', "DiscountedAmount", 'Orders'[Amount] * 0.9) ``` ##### **文本函数** - **LEFT**:从字符串的左侧开始提取指定数量的字符。 ```dax ShortProductName = LEFT('Products'[ProductName], 5) ``` - **CONCATENATE**:将两个字符串连接在一起。 ```dax FullName = CONCATENATE('Customers'[FirstName], 'Customers'[LastName]) ``` ##### **日期和时间函数** - **TODAY**:返回当前日期。 ```dax CurrentDate = TODAY() ``` - **DATE**:创建一个日期值。 ```dax SpecificDate = DATE(2023, 10, 1) ``` #### 4. **DAX在实际应用中的示例** 假设有一个销售数据模型,其中包含 `Sales` 表和 `Date` 表。可以通过以下 DAX 公式来计算不同维度的销售指标: - **计算年度销售总额**: ```dax AnnualSales = TOTALYTD(SUM('Sales'[Amount]), 'Date'[Date]) ``` - **计算每个产品的平均销售额**: ```dax AverageProductSales = AVERAGEX(VALUES('Products'[ProductID]), SUM('Sales'[Amount])) ``` - **计算特定日期的订单数量**: ```dax OrdersOnSpecificDate = CALCULATE(COUNT('Orders'[OrderID]), 'Orders'[OrderDate] = DATE(2023, 10, 1)) ``` #### 5. **注意事项** - **性能优化**:DAX 公式可能会对性能产生影响,尤其是在处理大量数据时。建议使用适当的索引和优化技巧来提高查询效率。 - **调试和测试**:在编写复杂的 DAX 公式时,建议逐步调试和测试每个部分,以确保逻辑正确。 - **文档和注释**:为 DAX 公式添加清晰的文档和注释,有助于团队协作和后期维护。 通过掌握这些 DAX 函数和技巧,用户可以在 Power BI 中实现更加复杂和灵活的数据分析任务,从而更好地支持业务决策。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

PowerBI | 夕枫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值