【数据分析BI】用 AI 写 DAX 度量值不求人
摘要:用 AI 帮你写出能直接用的 DAX 度量值,告别报错和看不懂。
一、痛点引入
你有没有过这种经历:领导一句话"把今年累计销售额和去年同期比一下",你打开 Power BI,新建度量值(measure,也就是 Power BI 里那种会随筛选自动重算的计算规则,像会变的公式),啪啪敲下 CALCULATE,回车——报错。
再试一次,又报错。上网搜,十篇教程八个讲得云里雾里,剩下两篇代码贴上去还是跑不通。最后要么找同事救火,要么自己硬啃,一下午就耗进去了。
说白了,DAX(Data Analysis Expressions,Power BI 用来做计算的一套公式语言)本身并不难,难的是它有一套"筛选上下文"的脾气:你顺着它就有结果,逆着它就给你脸色看。好消息是:现在有了 Copilot(Power BI 里内置的 AI 助手),咱们可以让它先把代码草稿写出来,你再照着改、照着验。本文就带你这么干,而且每个度量值我都给你验过、能跑的"标准答案"。
二、目标产出
学完这篇,你能拿到一套真实可运行的 DAX 度量值,直接贴进自己的 Power BI 就能用:
- 总销售额(用
SUMX逐行算数量×单价再求和) - 去年销售额(用
CALCULATE搭配时间智能函数比去年同期) - 大单销售额(只统计数量超过阈值的订单)
- 年初至今 / 月初至今销售额(用
TOTALYTD/TOTALMTD) - 同比增长率(用
DIVIDE安全除,避免除以零报错)
同时你也会学到:怎么给 Copilot 写一句到位的中文提示词,让它吐出来的 DAX 八九不离十;以及几个踩坑点,帮你少走弯路。
三、案例实战
本文用的数据模型(后面所有 DAX 都基于它,照抄前先对一下你的字段名)
Sales(销售事实表,fact table,就是记录每一笔业务明细的大表):Sales[OrderDate]订单日期、Sales[ProductID]产品编号、Sales[Quantity]数量、Sales[UnitPrice]单价Date(日期维度表,dimension table,就是一张专门放日期的辅助表):Date[Date]日期、Date[Year]年份、Date[Month]月份- 关系(relationship,两张表之间用来"对上号"的连线):
Sales[OrderDate]→Date[Date],多对一,保持激活(active,即连线是实线、起作用的状态)
第一步:把需求说清楚(给 Copilot 的提示词)
在 Power BI 的**报表视图的 Copilot 窗格(或 DAX 查询视图)**里,照下面这样写提示词。要点是:说清表名、字段名、要用的函数、想达到什么效果。越具体,它写得越准。
前提:Copilot 帮你写 DAX 需要付费容量(F2+/P1+ 等)+ Pro 或 PPU 许可证,且管理员开启(口径与 B21 一致,以 Microsoft Learn 当前文档为准),免费版 Power BI Desktop 里没有这个按钮。如果你用的是免费 Desktop、或暂时没有 Copilot,也完全不影响——直接照下文给出的"标准答案"手动建度量值即可(做法和 B21《第一张报表》一致)。
提示词示例(可直接复制,把字段名改成你自己的) "基于 Sales 表和 Date 表,写一个度量值叫【总销售额】。用
SUMX遍历 Sales 表的每一行,把Sales[Quantity]乘以Sales[UnitPrice]后求和。字段名以我的模型为准。"
Copilot 一般会回一段 DAX。咱们不要盲目照搬,先看懂、再校验。下面第二节开始,我给你一份我已经验过、能跑的"标准答案",你拿去对照——如果 AI 给的和这个思路一致,基本就能放心用。
第二步:照着标准答案,一个个写度量值
操作位置:报表视图里,点"建模"→"新建度量值"(或右键表名 → 新建度量值),把下面的代码整段粘进去。注意把字段名换成你自己的模型字段名。
① 总销售额(SUMX 逐行求和)
dax总销售额 = SUMX ( Sales, Sales[Quantity] * Sales[UnitPrice] )
SUMX 的意思是:先一行一行地扫 Sales 表,每行算出"数量×单价",再把所有行的结果加起来。它比直接 SUM(金额列) 更灵活——哪怕你的表里没有现成的金额列,也能现场算出来。
② 去年销售额(CALCULATE 改筛选 + 时间智能)
dax去年销售额 =
CALCULATE (
[总销售额],
SAMEPERIODLASTYEAR ( Date[Date] )
)CALCULATE 是 DAX 里的"变形金刚":它能临时改变筛选条件,再算一遍。这里它把日期筛选改成"去年同期那一段日期",所以 [总销售额] 就只在去年区间里重算。SAMEPERIODLASTYEAR 是时间智能函数(time intelligence,专门处理"同比/环比/累计"这类跟日期有关的运算),它把当前日期往回推一整年。
③ 大单销售额(CALCULATE + FILTER 只挑特定行)
dax大单销售额 =
CALCULATE (
[总销售额],
FILTER ( Sales, Sales[Quantity] > 10 )
)FILTER 会从 Sales 表里筛出"数量大于 10"的那些行,交给 CALCULATE 当新的筛选范围。于是 [总销售额] 只在"大单"里求和。把 10 换成你的业务阈值就行。
④ 年初至今销售额(TOTALYTD)
dax年初至今销售额 = TOTALYTD ( [总销售额], Date[Date] )
TOTALYTD(Total Year To Date,年初至今累计)算的是"从今年 1 月 1 日到当前筛选日期"的累计值。第一个参数是要累计的度量值,第二个参数是日期表的日期列。
⑤ 月初至今销售额(TOTALMTD)
dax月初至今销售额 = TOTALMTD ( [总销售额], Date[Date] )
TOTALMTD(Total Month To Date,月初至今累计)同理,算的是"本月 1 日到当前日期"的累计。
⑥ 同比增长率(DIVIDE 安全除)
dax同比增长率 = DIVIDE ( [总销售额] - [去年销售额], [去年销售额] )
DIVIDE 和直接写 / 的区别在于:当分母为 0(比如去年还没数据)时,它不会报错,而是返回空值。做财务、运营类比率,永远优先用 DIVIDE。
把这六个度量值都建好,拖到报表里,按年份、月份一切片,数字就会跟着变——这就是度量值的威力:同一段公式,换个筛选范围就自动重算。
四、原理小结
DAX 的核心是"上下文":SUMX 这类迭代函数靠行上下文一行行算;而 CALCULATE 妙在能把行上下文"升级"成筛选上下文,从而改变计算范围。时间智能函数(SAMEPERIODLASTYEAR、TOTALYTD、TOTALMTD)之所以能自动对齐去年同期、年初至今,前提是背后有一张连续、被标记为日期表的 Date 维度表撑着。理解了"筛选上下文 + 日期表"这两点,你再去读 AI 写的 DAX,就知道它每一步到底在改什么、为什么能算出那个数,而不是只会复制粘贴。
五、避坑指南
日期表"建议标记为日期表"(Mark as Date Table)。 时间智能函数(
TOTALYTD、SAMEPERIODLASTYEAR等)真正的前提,是日期列连续、无缺口,且Sales[OrderDate]→Date[Date]的关系已激活;在此基础上,再把 Date 表"标记为日期表"能帮 Power BI 正确识别时间层级、避免歧义。路径:报表视图 → 选中 Date 表 →"表工具"→ 标记为日期表。关系要激活、方向要对。
Sales[OrderDate]→Date[Date]这条关系必须是激活状态(实线,不是虚线)。如果是非激活关系,时间智能函数读不到,得用USERELATIONSHIP临时启用——新手先确保它是激活的,省得排查半天。FILTER别直接套大事实表做简单筛选。FILTER(Sales, ...)会逐行扫描整张销售表,数据量大时很慢。(性能补注:把判断写到CALCULATE的谓词参数里,引擎能做"谓词下推"、只扫需要的行,比FILTER先全表展开再筛快得多。)像"数量大于 10"这种简单判断,优先用CALCULATE的简写:CALCULATE([总销售额], Sales[Quantity] > 10);只在需要"行间比较"(比如和整张表的平均值比)时才用FILTER。度量值(measure)和计算列(calculated column)别搞混。 度量值不占存储、随筛选实时算,适合做汇总、比率、同比;计算列是建表时就逐行算好、存进表的字段,适合当筛选或分组的依据。做分析指标优先用度量值,别一上来就建计算列,否则文件会越撑越大、刷新越跑越慢。
财年不是自然年要写
year_end_date。TOTALYTD默认按 12 月 31 日截止。如果你的财年 6 月完结,要写成TOTALYTD([总销售额], Date[Date], "6/30"),否则累计区间会整段错开。
六、进阶延展
如果你想把这套"用 AI 写 DAX"的本事打得更牢,建议先回看 L1 的 B21《第一张报表》——它是本文的前置地基,讲清"第一张报表 + 第一个 SUM 度量值 + Copilot 边界"这件最基础的事。本文用到的"数据建模 / 日期维度表 / 表关系"不在 B21 范围;日期维度表的标准建立步骤见 B23《数据模型》;日期维度的搭建步骤在 B23《数据模型》里有完整示范,结合本文的 DAX 时间智能即可。
往上走,L3 层级我们会聊更硬核的:用 RANKX 做动态排名、用 CALCULATE + ALLEXCEPT 算占比、以及让 Copilot 帮你写变量(VAR)让复杂度量值更好读。到时候,真正的 DAX 达人就是你了。