人生没有彩排
每一天都是现场直播

PowerBI疑难解答:切片器选今天,PM MTD却算出了整月?

前言

最近遇到小伙伴提问:在计算本月至今的上月环比值时,只要切片器选了"今天"的日期,那么就会直接返回上月整个月的数据,而选择非"今天"的其他日期却都正常返回对应范围的环比值。

也就是说,假设今天是2025-12-10,那么希望其返回2025-11-01至2025-11-10的数据,但实际却返回了2025-11-01至2025-11-30的上月整个月的数据,而选择2025-12-09等其他日期时却能正确返回2025-11-01至2025-11-09的数据。

这显然不是DAX罢工了,而是背后触发了某种我们容易忽视的机制。因此这篇文章就带大家简单复盘一下,做个分享。

问题复现

这里我简单模拟了个类似的场景,并非那位小伙伴遇到的实际案例,具体问题如下图所示:

从上图可以看到,日期表与事实表为一对多关系,然后矩阵中的行标签以及度量值中的日期字段,都是使用的日期表中的日期,而不是事实表的。

然后左边矩阵计算的本月至今的上月环比值,在2025-10-12之前都是正常的,能够和上月的数据一一对应,但到了2025-10-12就直接返回了上月整个月的数据。这里的2025-10-12是订单表的最后一个日期,就当他是"今天"吧。

截止到这里,所有信息都已经揭露了,你能发现问题所在吗?建议大家先思考一下再往后阅读。

原因分析

首先,除了"今天"之外的其他日期都能计算出正确结果,那么可以初步排除是度量值逻辑写错了的情况,而且这个度量值的写法也比较简单、经典,不太有错误的可能。

那么接下来应该就是看下是否是日期列用错了,比如使用了事实表的日期字段等,但显然,矩阵的行标签以及度量值中都是使用的日期表的日期字段,因此日期列字段用错的情况也可以排除了。

那么接下来就只能是考虑下是否触发了什么机制了,最后结合“在今天就返回上月整月,而非今天就返回正确范围”的关键信息,就可以判断出这是触发了DATEADD函数的跨临界日期规则了,也就是说"今天"(2025-10-12)是所在月的临界日期,但"今天"明显不是月底日期,因此继而可以判断出日期表的日期范围是不全的。

最后经过提问的小伙伴确认,他的日期表的确是不全的,因此后续只需要把日期表补全,让其成为一个完整的标准日期表即可解决这个问题。

回到上面我模拟的这个场景中,日期表的创建表达式如下图所示:

由于开始日期和结束日期都是直接用的事实表的最小日期和最大日期,因此日期表极大可能是不全的。

那么将其改成下图所示的表达式,即可确保日期表的完整:

然后回到矩阵,就会返回正确结果了,如下图所示:

DATEADD函数的跨临界日期规则

可能有些小伙伴不清楚DATEADD函数的跨临界日期规则是什么,因此这一小节就简单介绍一下。这个规则在之前介绍DAX的时间智能函数时也介绍过,可以参考这篇文章:PowerBI/DAX之时间智能函数(五)

当选择中包含一个月的最后一天,且选择的跨度超过一天时,DATEADD函数的结果包含从平移月份的对应日期到平移月份结束的所有天数。如下图所示:

在矩阵明细行中,单个日期的平移并没有问题。但在小计与总计行中,可见日期包含2/27与2/28两天,虽然理论上平移后的日期应该是1/27与1/28这两天,但由于2/28还是二月份的最后一天,所以会触发跨临界日期规则,导致返回的结果持续到了平移月份的月底,即返回:1/27至1/31。

另外,由于跨临界日期规则的影响,日期表如果不连续或不完整,那么可能会带来意想不到的结果,如下图所示:

由于二月份只有2/27与2/28这两天,因此这两个日期就代表了二月份,所以将2/27与2/28这两天向过去平移一个月时,其对应的是一月份的所有日期,因此会返回日期列中存在的一月份的所有日期。

创建标准日期表

日期表虽然也只是一个表,但实际上它是比较特殊的,隐藏有许多机制,如果感兴趣的话可以参考下这篇文章,里面有详细介绍:PowerBI/DAX之应用日期表时的注意事项

然后从上面的案例中也可以看到,在使用时间智能函数时,不规范的日期表可能会带来意想不到的结果,而这往往也是容易忽视的一个点。

所以在创建日期表时,遵从标准日期表的最佳实践,保证日期范围的连续、完整、且能覆盖模型中的所有日期,就能够避免许多问题。

下面推荐一个创建标准日期表的方法,那就是使用我创建的DAX共享函数库中的自定义函数,只需要传入开始与结束的年份,就可以生成一个包含年、季度、月等各种字段的标准日期表,如下图所示:

除了手动传入年份范围外,还可以使用另一个能自动检测范围的自定义函数。这个函数就不需要输入年份范围,只需要传入每周的起始日期参数即可,如下图所示:

通过这两个函数来创建日期表,还是比较方便的,而且也能避免"不标准"的问题,欢迎大家尝试使用!

如果你还不太了解 DAX 共享函数库是什么、能做些什么,那么可以参考这篇文章:重磅升级!DAX共享函数库功能增强,图表与功能函数全面解锁!

总结

最后稍微总结一下,本篇文章所介绍的疑难案例,其实是因为不完整的日期表导致"今天"被误判为月末,进而触发了DATEADD函数的跨临界日期规则,从而返回了上月整月数据。解决方法就是确保日期表覆盖完整年份范围,使其成为标准的连续日期表。

赞(0) 打赏
版权声明:本文为夕枫的原创文章,著作权归作者所有,未经允许不得转载
文章名称:《PowerBI疑难解答:切片器选今天,PM MTD却算出了整月?》
文章链接:https://www.ximaple.com/posts/1697.html
订阅评论
提醒
guest
0 评论
最新
最久 最赞
内联反馈
查看所有评论

觉得文章有用的话就支持一下吧~

感谢您的打赏支持,我将持续输出有价值的内容!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册

Operation don't support