加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,提问交流,有问必答。
当月没到最后一天的时候,PowerBI报告中的去年同期MTD(QTD/YTD类似)显示的是所选月份的整月数字(如下图,3492是去年2月的整月数字)。以月份为报告周期,MTD的实际数字会和去年同期的整月数字做对比,是一种看报告的方式。还有一种需求是,希望和去年MTD(与今年MTD的截止日期相同)做对比,苹果对苹果。该怎么办呢?
解决方案
之所以出现默认返回整月数字,是因为报告是月报,页面上的切片器等日期颗粒度只设置到了月份,没有到天。这种情况下,计算机没有收到一个具体到天的时间点,MTD时间智能函数默认取所选月份的最后一天,去年同期自然也就是取整月数字了。
在保持月报形式、不增加到天的日期切片器前提下,可以给度量值套上一个到天的日期时间点的筛选条件。考虑到过往月份和未来月份,不能把时间点锁死在固定的事实表日期的最大值上。当切片器复选,选择时间段的最大日期比事实表最大日期所在月份的最后一天还大(跨月选择,且超过了事实表最大日期的月份),时间点取选择时间段的最大日期;当事实表最大日期在选择时间段内,时间点取事实表最大日期;其余情况取选择时间段的最大日期。
举例
模型
销售表
2024年数据截止到2024年2月20日,2023年2月全月销量为3492,截止到20日销量为2932。
度量值
销量:
Sales = SUM('销售表'[销售数量])
销量MTD:
Sales_MTD = TOTALMTD(sum('销售表'[销售数量]), Dim_Date[Date])
同期为整月的销量MTD:
Sales_MTD_LY = CALCULATE([Sales_MTD], SAMEPERIODLASTYEAR(Dim_Date[Date]))
同期为当前截止日期的销量MTD:
Sales_MTD_LY_2 =
VAR _vm_MaxSalesDate = MAXX(ALL('销售表'), '销售表'[日期])
VAR _vm_MaxSalesDate_MonthEnd = EOMONTH(_vm_MaxSalesDate,0)
VAR _vm_SelectedMinDate = MIN(Dim_Date[Date])
VAR _vm_SelectedMaxDate = MAX(Dim_Date[Date])
VAR _vm_DatePoint =
SWITCH(TRUE(),
_vm_SelectedMaxDate>_vm_MaxSalesDate_MonthEnd, _vm_SelectedMaxDate,
_vm_MaxSalesDate>=_vm_SelectedMinDate && _vm_MaxSalesDate<=_vm_SelectedMaxDate, _vm_MaxSalesDate,
_vm_SelectedMaxDate
)
RETURN CALCULATE([Sales_MTD_LY], FILTER(Dim_Date, [Date] <=_vm_DatePoint))
当报告页面切片器选择2024年2月的时候,可以看到,去年同期Sales_MTD_LY返回的是2023年2月的整月数字,Sales_MTD_LY_2返回的是2023年2月截止到20日的数字。
当报告页面切片器选择2024年1月、2月、3月的时候,可以看到,1月的去年同期两个度量值返回的都是2023年1月的整月数字;2月的去年同期Sales_MTD_LY返回的是2023年2月的整月数字,Sales_MTD_LY_2返回的是2023年2月截止到20日的数字;3月和总计的去年同期两个度量值返回的都是2023年3月的整月数字。