今天这一篇我是迟迟不能下手,因为函数计算的逻辑和官方文档给的结果不一样,能查到的网上的所有教程也都是按照官方文档来写的,没有一篇指出了我发现的这个问题。看了一下官网更新的时间是一年多以前了,应该是这期间内这些函数有所调动,但是网络上很多都是复制粘贴,我看他们要么只复制粘贴理论,没有结果也就不能发现问题了;要么还有一部分就把官方的例子复制粘贴过了,也就不管了。这是一个很严肃的问题。
今天介绍的几个函数作用是计算本周、本月、本季度、本年至今当期的数据,得到的是一个数值,作用主要是用来单独卡片展示或者形成一段文本描述的。最后再讲一下累计至今数据是怎么实现的。
先以本月至今MTD来详细讲解一下功能用法,以及和官方案例不一样的地方,为了验证是不是我个人PowerBI版本的问题,还是用来PowerPivot进行验证,结果和我推测的结果相同,官方的案例有问题。有两个函数可以实现本月至今的计算,DATESMTD和TOTALMTD,前者需要结合CALCULATE使用,更能够发现问题,后者是直接计算出结果。所以我们就用DATESMTD来进行讲解,DATESMTD语法格式很简单,就是对指定的日期类型列,返回该月份至今的一列日期,语法格式如下↓
DATESMTD(<dates>)
这里需要注意的是,返回的是制定日期列里面的最后一个天那个月里面的第一天到最后一天的数据,而不是我们现实中月份的1号到今天的数据。比如说我们选择的日期列最后一天是2025.3.9号,那么返回的日期表就是2025.3.1-2025.3.9号。就算我们把日期维度表和实际销售表建立关系了,如果使用日期维度表作为参考,也是返回日期维度表的最后一天数据。而我们在网上看到的博客案例都是说返回销售表的实际数据,但他们没有给出结果,只讲了理论。
我从新模拟的数据是到2021.8.12号,日期维度表最后一天是2021.12.31号,并且把模拟数据和日期维度表建立了关联关系。因为DATESMTD返回的是一个表,为了更直观的感受,我们就使用DATESMTD分别对日期维度表和模拟数据里面的日期就行建表,结果如下↓
日期维度表 = DATESMTD('日期表'[日期])
销售表日期 = DATESMTD('模拟销售数据'[日期])
这样结果就很明显了,和我们上面说的逻辑是一样的。所以如果我们需要计算真实的本月至今的数据,日期这一列需要选择销售表里面的日期。我们还是使用两个维度列来演示一下本月至今的数据结果,DAX语句如下↓
MTD金额 = CALCULATE([金额(万)],DATESMTD('模拟销售数据'[日期]))
MTD金额dt = CALCULATE([金额(万)],DATESMTD('日期表'[日期]))
结果还是和想象中一样的,后者的筛选日期是12月,那时候还没有销售数据,所以自然是没有数据的。为了进一步验证是不是PowerBI的问题,又使用相同的数据在PowerPivot里面演示了一下,结果如下,还是一样的结果,所有后面我们就不再纠结这个问题了,都使用销售表里面的日期维度作为筛选项。
然后是另一个计算本月至今的函数TOTALMTD,语法格式如下↓
TOTALMTD(<expression>,<dates>[,<filter>])
然后再把上面的数据计算一遍,其实仔细一看,使用方法都差不多,后面根据自己需求选择自己喜欢的就行了↓
TMTD金额 = TOTALMTD([金额(万)],'模拟销售数据'[日期])
有了上面的铺垫,官方还给出了季度至今和年度至今的函数,语法格式和逻辑都是一样的,还是分别有两个函数,下面分别展示一下↓
QTD金额 = CALCULATE([金额(万)],DATESQTD('模拟销售数据'[日期]))
TQTD金额 = TOTALQTD([金额(万)],'模拟销售数据'[日期])
YTD金额 = CALCULATE([金额(万)],DATESYTD('模拟销售数据'[日期]))
TYTD金额 = TOTALYTD([金额(万)],'模拟销售数据'[日期])
然后是累计至今的数据计算,如果没有做任何筛选的话,用SUM求和出来的结果就是累计的数据。这样的话我们也不会在这里多说了。这里主要是想讲一个功能,就是累计至当期的数据,比如说以月为维度,累积到每个月的时候总的金额是多少呢。思路还是很简单,就是先取消日期筛选,然后筛选出所有小于当期最后一天的日期就行了,DAX和结果如下↓
TTD金额 = CALCULATE(
[金额(万)],
FILTER(
ALL('日期表'),
'日期表'[日期]<=MAX('模拟销售数据'[日期]))
)
最后是本周累计至今的计算方式,周还是一个非常重要的维度,这里还是主要利用周号结合年号来实现的↓
WTD金额 =
VAR crtw=WEEKNUM(TODAY(),2)
VAR crty=YEAR(TODAY())
RETURN
CALCULATE(
[金额(万)],
FILTER(
ALL('日期表'),
'日期表'[weeknum]=crtw&&'日期表'[yearn]=crty
)
)
然后把上面的形式改变一下,使用自定义的周号,就可以实现以前每周同期的数据了↓
WTD同期金额 =
VAR crtw=SELECTEDVALUE('日期表'[weeknum])
VAR crty=SELECTEDVALUE('日期表'[yearn])
VAR crtd=WEEKDAY(TODAY(),2)
RETURN
CALCULATE(
[金额(万)],
FILTER(
ALL('日期表'),
'日期表'[weeknum]=crtw
&&'日期表'[yearn]=crty
&&'日期表'[weekday]<=crtd
)
)
最后再做一个文本展示合集,更新数据后就会动态显示各项数据了,放在数据报表里面还是可以看的↓
描述 =
"截止今日:"&UNICHAR(10)&
"本周销售金额"&FORMAT([WTD金额],"#0.0万元;")&UNICHAR(10)&
"本月销售金额"&FORMAT([MTD金额],"#0.0万元;")&UNICHAR(10)&
"本季销售金额"&FORMAT([QTD金额],"#0.0万元;")&UNICHAR(10)&
"本年销售金额"&FORMAT([YTD金额],"#0.0万元;")
End
,