DAX是什么:先理解筛选上下文
DAX(Data Analysis Expressions)是Power BI、Excel Power Pivot 中的公式语言。初学DAX最大的障碍不是语法,而是筛选上下文这个概念:你写的每个度量值,都是在当前筛选环境下计算的。比如在华东区切片器下,SUM(销售额) 自动只算华东区的数据,这就是筛选上下文在起作用。
理解这一点后,DAX的很多奇怪行为就顺了。本教程按基础函数、进阶函数、业务模板三层推进。
第一步:基础度量值
在Power BI中,右键数据表选择新建度量值,输入公式回车即可。最基础的三个:
总销售额 = SUM(销售表[金额])
总订单数 = COUNTROWS(销售表)
去重客户数 = DISTINCTCOUNT(销售表[客户ID])
把这三个度量值拖到卡片视觉对象上,一张基础看板就有了。注意:DAX用表名[列名] 引用字段,中文表名列名直接可用。
第二步:CALCULATE——DAX的灵魂
CALCULATE 的作用是在修改筛选条件的情况下计算。格式:CALCULATE( 计算表达式, 筛选条件 )。三个高频写法:
华东销售额 = CALCULATE(SUM(销售表[金额]), 销售表[区域]=”华东”)
上月销售额 = CALCULATE(SUM(销售表[金额]), PREVIOUSMONTH(日期表[日期]))
高价值订单额 = CALCULATE(SUM(销售表[金额]), 销售表[金额]>10000)
其中 PREVIOUSMONTH 等时间智能函数要求模型中存在连续的日期表(可在Power BI中新建日期表),这是做同期对比的基础。
第三步:FILTER与IF的条件组合
FILTER 用于复杂筛选:销售额大于1万 且 属于VIP客户的订单额:CALCULATE(SUM(销售表[金额]), FILTER(销售表, 销售表[金额]>10000 && RELATED(客户表[等级])=”VIP”))。IF 用于逻辑判断,常配合度量值做分类:销售额等级 = IF(SUM(销售表[金额])>100000, “高”, IF(SUM(销售表[金额])>50000, “中”, “低”))。
技巧:能不用FILTER就不用(性能更好),先用CALCULATE的简单筛选条件,解决不了再上FILTER。
第四步:3个业务场景模板
场景一:销售达成率
达成率 = DIVIDE(SUM(销售表[实际金额]), SUM(目标表[目标金额]), 0)。用 DIVIDE 而不是除号,除数为0时返回第三个参数(0),避免报错。
场景二:同比环比
同比 = CALCULATE(SUM(销售表[金额]), SAMEPERIODLASTYEAR(日期表[日期]))
环比 = CALCULATE(SUM(销售表[金额]), PREVIOUSMONTH(日期表[日期]))
同比增长率 = DIVIDE(SUM(销售表[金额])-同比, 同比, 0)
场景三:ABC分类
先算累计占比:ABC分类公式较复杂,建议使用RankX函数,实际工作中直接搜索DAX ABC分析模板套用更高效。
第五步:常见错误排查
错误一无法确定表:检查是否用了未在模型中的列名。错误二循环依赖:度量值引用了自身,检查公式。错误三时间智能函数报错:模型中没有日期表,先新建。DAX调试技巧:用新表功能把度量值结果输出成表查看中间值,比直接看报表更直观。