上周三下午同事小李把笔记本转过来给我看——他的 Power BI 文件里有一个度量值168 行。你看这个…他指着屏幕上密密麻麻的 DAX 代码「YTD 累计、去年同期、环比增长率、还有按区域拆分的版本……一个指标我写了 8个度量值每个都是一样的计算逻辑只是参数不一样。」他问我能不能简化。我打开了刚升级的 Power BI Desktop2026 年 6 月版在模型视图里新建了一个 DAX UDF。3 行代码。然后把这 8 个度量值全部重写每个只用了 1 行。小李盯着屏幕看了 10 秒钟说了句「这东西什么时候有的」我说「上个月刚正式上线。来我教你。」这篇文章就是那天下午我教他的全部内容。一、先搞懂DAX UDF 到底是什么UDF User Defined Function用户自定义函数。说白了就是把你重复写了很多遍的计算逻辑封装成一个函数起个名字。以后要用的时候调这个名字就行不用再复制粘贴一大段代码。举个例子。你写过这种度量值吗Sales YTD CALCULATE( SUM(Sales[Amount]), DATESYTD(‘Calendar’[Date]) )然后你又写了Profit YTD CALCULATE( SUM(Sales[Profit]), DATESYTD(‘Calendar’[Date]) )然后又写了 Cost YTD、Quantity YTD……每个度量值 90% 的代码一模一样只有 SUM 里面的字段名不同。有了 DAX UDF你可以这样写FUNCTION YTD_Calc (Measure : MEASUREREF) CALCULATE( Measure, DATESYTD(‘Calendar’[Date]) )然后那 8 个度量值全部变成Sales YTD YTD_Calc([Total Sales]) Profit YTD YTD_Calc([Total Profit]) Cost YTD YTD_Calc([Total Cost])从 168 行到不到 20 行。而且改逻辑只改一处不用追着 8 个度量值一个个改。二、核心语法5 分钟上手DAX UDF 的语法长这样FUNCTION 函数名 (参数1 : 类型, 参数2 : 类型) 表达式拆开来看① FUNCTION 关键字 —— 告诉 DAX「我要定义一个函数了」② 函数名 —— 你起的名字跟度量值命名规则一样③ 参数列表 —— 括号里写参数名和类型用逗号分隔④ 箭头 —— 念作「返回」⑤ 表达式 —— 函数体就是你要复用的计算逻辑支持的参数类型SCALAR — 标量值数字、文本 TABLE — 表 MEASUREREF — 度量值引用最常用 COLUMNREF — 列引用 TABLEREF — 表引用 CALENDARREF — 日期表引用还有一个很有用的特性可选参数。你可以给参数设默认值FUNCTION GrowthRate ( CurrentVal : SCALAR, PriorVal : SCALAR, Decimals : SCALAR 2 ) ROUND( DIVIDE(CurrentVal - PriorVal, PriorVal), Decimals )调用时只传两个参数也可以Decimals 自动取默认值 2。三、三个实战场景立刻能用场景 1批量生成「占总额百分比」度量值痛点你有 12 个产品线的销售额度量值每个都要算「占总销售额百分比」。传统做法是写 12 个 DIVIDE 公式。用 UDFFUNCTION PctOfTotal ( Part : MEASUREREF, Whole : MEASUREREF ) DIVIDE(Part, Whole)然后产品A占比 PctOfTotal([产品A销售额], [总销售额]) 产品B占比 PctOfTotal([产品B销售额], [总销售额]) …场景 2统一的时间智能封装YTD、QTD、MTD、去年同期……每个时间智能都写一遍 CALCULATE 时间函数手酸。FUNCTION TimeIntel ( Measure : MEASUREREF, Period : SCALAR ) SWITCH( Period, “YTD”, CALCULATE(Measure, DATESYTD(‘Calendar’[Date])), “QTD”, CALCULATE(Measure, DATESQTD(‘Calendar’[Date])), “MTD”, CALCULATE(Measure, DATESMTD(‘Calendar’[Date])), “PY”, CALCULATE(Measure, SAMEPERIODLASTYEAR(‘Calendar’[Date])), Measure )一个函数搞定 4 种时间计算。任何一个度量值要加时间维度一行搞定销售额_YTD TimeIntel([Total Sales], “YTD”) 销售额_去年同期 TimeIntel([Total Sales], “PY”)场景 3口径统一的 KPI 计算器很多企业的毛利率、净利率、周转率计算口径不一致——财务部一套口径、业务部另一套口径对账时吵架。用 UDF 把口径锁死FUNCTION GrossMargin ( Revenue : MEASUREREF, Cost : MEASUREREF ) DIVIDE(Revenue - Cost, Revenue)全公司所有的毛利率计算都调这个函数。口径变了只改一处不存在「财务部算出来 28%业务部算出来 31%」这种事了。四、怎么在你的 Power BI 里创建 DAX UDF前提Power BI Desktop 2026 年 6 月版或更高版本。还没升级的去 Microsoft Store 更新。步骤 1打开模型视图在 Power BI Desktop 左侧导航栏点击「模型」视图第三个图标。步骤 2找到 UDF 入口在模型视图顶部的功能区找到「DAX 用户定义函数」或在「主页」选项卡的「计算」组里。点击「新建 DAX 用户定义函数」。步骤 3写函数在弹出的编辑器中输入你的函数定义。语法就是上面讲的 FUNCTION … … 格式。写完点「保存」。步骤 4调用函数回到报表视图新建度量值直接写函数名加参数。跟调内置 DAX 函数一模一样。支持在 Web 端建模Power BI Service 里的语义模型编辑中查看和修改 UDF不用非得装 Desktop。另外UDF 保存在 TMDL 格式里。如果你的工作区开启了 Git 集成UDF 代码可以直接纳入版本管理。团队成员在 Git 上就能看到函数定义不用再在群里问「这个度量值怎么算的」。五、用之前要知道的几件事❶ UDF 目前不能嵌套调用另一个 UDF。不能在一个 UDF 里面调另一个 UDF。这个限制后续版本大概率会放开。❷ 函数体内只能用 DAX 表达式不能用变量声明VAR/RETURN。这个限制我也在等微软放开。❸ 如果 UDF 依赖的表或度量值被删除调用它的度量值会报错。建议把 UDF 命名规范化比如加前缀 fn_ 或 udf_方便识别和管理。❹ 性能方面UDF 本质上是在度量值计算时「展开」执行不会引入额外性能开销。不会因为它是个函数就跑得更慢。六、不想自己写让 AI 帮你生成 UDF上面三个场景的 UDF 代码其实不用你自己写。智能小V 接入了 Power BI 语义模型你可以直接用自然语言说「帮我把所有产品线的销售额批量生成占总销售额百分比的度量值用 DAX UDF 封装。」几秒钟后UDF 代码和批量度量值就生成好了。你复制粘贴进 Power BI 就行。这是智能小V的 Data Agent 能力之一——理解你的语义模型结构知道有哪些表、哪些度量值然后自动生成符合你数据模型的 DAX 代码。写在最后DAX UDFs 不是什么颠覆性的新概念。程序员用了 40 年的函数封装DAX 现在终于有了。但它解决了一个很具体的问题重复劳动。你不需要再写第 17 个 CALCULATE(DATESYTD(…)) 了。把重复的逻辑封装成函数改了只改一处新人来了看函数名就知道是什么意思——这本身就是最好的「数据治理」。你的语义模型里有多少个度量值是「同一个计算逻辑换了不同字段」花 10 分钟把它们改成 UDF你的模型维护成本至少降一半。