如何在PowerBI中通过DAX编程为新表添加列?
嘿,我懂你那种习惯了用循环处理数据的感觉,但DAX是函数式编程语言,它的思路不是逐行写循环,而是基于列或表的聚合、迭代操作来实现计算。咱们不用写循环,直接用DAX的内置函数就能搞定你要的列,下面给你几个常见场景的示例,你可以根据自己的实际需求调整:
这是最基础的计算,直接添加计算列就行,DAX会自动逐行执行公式:
Total Amount = '原材料订单'[Amount] * '原材料订单'[Price]
如果想按月份顺序,算出每个产品到当前月份为止的累计采购数量,咱们可以用CALCULATE搭配FILTER来实现(前提是你得把Month列转成可排序的日期格式,比如把Jan 18转换成2018-01-01,假设这个日期列叫Order Date):
累计采购量 = CALCULATE( SUM('原材料订单'[Amount]), FILTER( ALL('原材料订单'), '原材料订单'[Name] = EARLIER('原材料订单'[Name]) && '原材料订单'[Order Date] <= EARLIER('原材料订单'[Order Date]) ) )
这里的EARLIER是用来引用当前行的产品名称和日期,FILTER会筛选出同一产品且日期早于等于当前行的所有订单,再用SUM求和,这就替代了循环里的累计逻辑。
要是想统计同一产品在同一个月里的平均单价,用AVERAGEX这个迭代函数就很合适:
月平均单价 = AVERAGEX( FILTER( '原材料订单', '原材料订单'[Name] = EARLIER('原材料订单'[Name]) && '原材料订单'[Month] = EARLIER('原材料订单'[Month]) ), '原材料订单'[Price] )
AVERAGEX会自动遍历筛选出来的同产品同月的所有行,计算它们的单价平均值,效果和你写循环遍历计算是一样的。
如果想知道当前订单和同产品上月订单的价格差,可以用变量+LOOKUPVALUE来实现:
上月价格差异 = VAR 当前产品 = '原材料订单'[Name] VAR 当前月份日期 = '原材料订单'[Order Date] VAR 上月日期 = EOMONTH(当前月份日期, -1) VAR 上月单价 = LOOKUPVALUE( '原材料订单'[Price], '原材料订单'[Name], 当前产品, '原材料订单'[Month], FORMAT(上月日期, "mmm yy") ) RETURN '原材料订单'[Price] - 上月单价
这里用变量分步处理逻辑,先拿到当前的产品和日期,找到上月的日期,再匹配出上月的单价,最后计算差值,DAX会自动对每一行执行这套逻辑。
总的来说,DAX的核心是基于上下文的计算,你不用操心怎么遍历每一行,只需要告诉DAX你要筛选的范围和计算规则,它就会自动处理所有数据。如果你的需求是其他特定的列计算,可以把具体想要的功能说出来,我再帮你调整公式~
内容的提问来源于stack exchange,提问作者gewa

