前言
在 DAX 自定义函数功能出来后,我在欣喜于 DAX 终于可以进行逻辑复用、不用重复造轮子后,更意识到:这个功能让 Power BI 和 DAX 进入了一个全新的阶段。
DAX 自定义函数的出现,不仅仅是多了一个语法特性,它更改变了 DAX 代码的组织方式与团队协作模式——我们终于可以把“可复用的能力”从零散的度量值里抽出来,沉淀为可维护、可共享、可版本化的函数资产。而共享函数库,就是这场变革的加速器:把常用模式打包成标准工具,让每个模型、每个报表都能站在同一套“能力底座”之上,持续扩展 Power BI 与 DAX 的能力边界。
之前为了让 DAX 自定义函数功能发挥最大价值,我创建了一个共享函数库,但当初只有文本函数与日期函数这两个类别的基础扩展函数。而现在,我对共享函数库进行了全面增强:新增 功能函数、图表函数、其他函数 等在内的 60 多个实用函数,目前总共有 116 个函数,覆盖广泛的分析与可视化场景,可帮助你显著减少重复劳动、提升开发与维护效率。
由于业务的复杂性与分析场景的多样化,很难用一个“万能函数”来概括所有需求。因此,本共享函数库中的函数更立足于“底层”:提供一组稳定、通用、可组合的工具能力,让你在面对不同业务口径、不同展示要求时,能够更快搭建逻辑、更稳输出结果。
该共享函数库仍在持续建设中,后续将不断添加各种自定义函数。如果你在使用中有任何问题或想法,欢迎在评论区提交你的需求与改进建议!
函数分类与典型场景
目前已经实现了的函数的分类与典型场景如下。
1、文本函数
这些自定义的文本函数弥补了DAX语言对文本处理的不足,提供了常用的文本处理函数,包括清洗、提取、转换和重组文本数据等。
典型场景包括:
- 文本清洗与规整
- 去掉控制字符 / 零宽字符(
Clean),解决莫名其妙的匹配失败、联接失败。 - 去掉前后多余符号(
Trim/TrimStart/TrimEnd),把“看起来一样但其实不一样”的文本统一起来。
- 去掉控制字符 / 零宽字符(
- 文本切割与重组
- 取第 N 个分隔符前/后的内容(
BeforeDelimiter/AfterDelimiter),轻松从复合字段中拆出“省-市-区”、“大类-中类-小类”等。 - 在多个分隔符之间提取内容(
BetweenDelimiters),适用于 URL 参数、标记串等复杂文本。 - 按任意字符集拆分(
SplitAny),处理“多个符号混着当分隔符”的场景。
- 取第 N 个分隔符前/后的内容(
- 判定、查找与格式美化
- 判断是否包含、是否以某段开头/结尾(
IsContains/StartsWith/EndsWith),可选大小写敏感。 - 文本长度、大小写转换、首字母大写(
Length/Lower/Upper/Proper),让展示更专业。 - 灵活取位、插入、删除、反转等(
Range/InsertText/Remove/Reverse),应对各种历史遗留“奇葩编码”。
- 判断是否包含、是否以某段开头/结尾(
2、日期函数
这些自定义的日期函数添加了一些DAX语言所没有的日期函数,比如日期表创建函数、本周至今函数等,让日期的处理更加方便。
典型场景包括:
- 一键生成“强力日期表”
- 指定年份范围生成标准日期表(
DateTable),带年份、季度、月份、年月、年季等常用衍生字段。 - 自动扫描模型日期范围生成日期表(
DateTableAuto),避免手动调日期上下限。
- 指定年份范围生成标准日期表(
- 常用时间区间与边界
- 获取本周至今日期集(
DatesWTD),方便构建“本周至今”指标。 - 周 / 月 / 季 / 年的起始与结束日期(
StartOf*/EndOf*),让时间边界计算高度统一。
- 获取本周至今日期集(
- 时区与时间戳
- 修正 Service 时区的“时间错位”问题(
LocalDate/LocalDatetime),保证线上线下时间一致。 - 时间戳与日期互转(
Timestamp/TimestampToDatetime),对接日志、API 时更顺手。
- 修正 Service 时区的“时间错位”问题(
3、功能函数
这些自定义的功能函数将提供各种标准业务逻辑函数或功能模块函数,比如新老客查找、帕累托分析、重复值排名等各种功能函数。通过这些模块化的功能函数,可以像搭积木一样,让报表的开发更加简单高效。
典型场景包括:
- 经典分析模型
- 帕累托 ABC 分类(
ABCClass/ABCClassExact),直接得到 A/B/C 类客户、商品等。 - 通用分箱(
BucketByRange),用字符串定义区间和标签,就能完成价格区间、年龄段、客单价档位等分组。
- 帕累托 ABC 分类(
- 常见指标套路
- 同比/环比/占比/累计等一系列指标(
YOY.*/QOQ.*/MOM.*/YTD.*/QTD.*/MTD.*/PctOfTotal/MovingAverage等),大幅减少你重复实现“同一套时间比较逻辑”的次数。 - 加权平均、累计值/累计占比(
WeightedAvg/Cumulative*/CumulativePct*),适用于价格、评分、贡献度等场景。
- 同比/环比/占比/累计等一系列指标(
- 质量与一致性修正
- 修复小计/总计不等于明细之和的问题(
LetTotalEqualDetails_1~_4),非常实用的“报表纠偏器”。 - 统计重复项、取最大/最小对应项、前/后一个非空值(
DuplicatesCount/ItemAtMax/ItemAtMin/PreNonBlankValue/NextNonBlankValue),适用于数据质量分析、KPI 连续性处理等。
- 修复小计/总计不等于明细之和的问题(
- 逻辑辅助与排名
- ALL / ANY 判断(
AllTrue/AnyTrue)、计数满足条件的行(CountTrue),帮你写出更语义化的逻辑表达式。 - 连续排名(
RankByContinued),解决“同值不同名次”的排名需求。
- ALL / ANY 判断(
4、图表函数
这些自定义的图表函数使用HTML或SVG等语言进行扩展,每一个函数对应一种图表效果,可以通过函数参数来调整图表样式或效果。只需要传入度量值指标与相关样式参数,并放入HTML Content视觉对象或其他支持图像的视觉对象中,就能绘制出对应的图表。
典型场景包括:
- 指标卡与 SVG 形状图标
- HTML KPI 卡片(
HtmlChart.KPICard):主值 + 同比值在同一行精细排版,通过参数控制颜色与大小,适合 HTML Content 视觉对象。 - 正负图标(
SvgChart.ShapeIcon):根据值正负自动显示上升/下降图标+颜色,可用于矩阵/表格图标条件格式。
- HTML KPI 卡片(
- 标签、分割线与水印
- 胶囊标签行(
SvgChart.TextLabels):将分隔符拼接的标签串直接渲染成一行美化后的标签,适合展示多标签字段。 - 矩阵列/区域分割线(
SvgChart.MatrixSplitLine):在表格/矩阵中加入竖线进行区块分割。 - 水印背景(
SvgChart.WatermarkBackground):快速生成整屏水印,用于“作品署名”、“内容防搬运”等场景。
- 胶囊标签行(
5、其他函数
该函数库将收录一些不好分类或暂未分类的自定义函数。
目前只有一组标准颜色函数(如 Red / Green / Yellow / Blue / Black / White / Transparent),可帮助你在度量值中保持颜色定义的统一与可读性。
函数应用示例
1、修复产品类别与产品名称维度下,产品类别的小计与总计部分的客户人数不等于明细之和的问题。

2、计算销售额,并自动格式化成合适的单位。

3、对各产品的采购价进行分组,并返回自定义标签。

4、按产品类别分类,降序累计各产品的采购价格。

……
共享函数库地址
该共享函数库发布在我的博客上,入口如下图所示:

传送门:https://www.ximaple.com/posts/1290.html
使用方式
方式一:DAX查询
在每个函数类别页面中,提供了对应类别的函数库的创建代码,将其复制到DAX查询中运行即可导入对应函数库。

然后在菜单栏中,可以查看每个自定义函数的具体语法与介绍。

方式二:外部工具
还可以使用配套的PowerBI外部工具来导入已发布的所有自定义函数,如下图所示:

该外部工具会自动联网获取最新的DAX自定义函数列表,可搜索或选择要导入的DAX自定义函数,然后选择对应的PowerBI实例后,点击开始导入即可。
另外,该外部工具还支持导入SQLBI的DaxLib平台的函数,并支持本地函数库功能,而且除了下拉选择模式外还支持模糊搜索模式。
该外部工具的获取方式如下:
关于该外部工具的安装与使用方式,可阅读附带的 README.txt 文件,如下图所示:

参与贡献
共享函数库的价值,不只在于“我写了多少”,更在于能不能变成一个可持续增长的生态。
如果你有:
-
实战中非常高频、非常通用的 DAX 逻辑
-
更优雅/更性能友好的实现方式
-
对现有函数的改进建议或新需求
那么欢迎在评论区留言或进行投稿,一起把这套函数库打磨得更强、更稳、更好用。
投稿说明:https://www.ximaple.com/posts/1440.html
总结
一行 DAX 写过一次,就不该被重复写 N 次。把沉淀下来的经验变成“共享函数库”,是给自己,也是给社区的一份长期红利。让我们一起构建 Power BI DAX 自定义函数生态,让数据分析更高效、更优雅、更有趣吧。


















