场景需求:
- 求完整月的rolling 12
- 设置切片器,动态选择财年、Rolling12 month,图表发生对应改变。
- 比如今天2021.02.09,那么rolling12就是2020.02.01-2021.01.31.
因为2月份数据不是整月,所以既不显示在图表上,也不纳入计算 - 报表每天刷新至昨天的数据,因为报表中有需要每天监控的部分。所以不能设置报表每月月初刷新。
实现:
1. 构建切片器维度表,将rolling12和财年结合起来
Temp_table_timeperiod = UNION(
DATATABLE (
"period", STRING,
{
{ "Rolling 12 Months" }
}
),
DISTINCT(CalendarTable[Financial Year])
)
2. 求measure
整体思路是:
先求完整月的日期,然后rolling的话就往前推12个月即可;
以及,显示上不显示最后一个非完整月,所以还需要判断是否完整月,否的话blank()
1) 准备工作
--报表刷新时间,这个值是在pq里写的 现在将其作为度量值
RefreshDate = SELECTEDVALUE(DataRefreshTime[DataRefreshTIme])
--求报表刷新时间的月底
RefreshDate.Eomonth = EOMONTH([RefreshDate],0)
--求完整月的月底,思路是如果刷新时间小于刷新时间月底,则返回刷新时间上个月的月底;否则返回刷新时间月底
Eomonth.fullmonth =
IF (
[RefreshDate] < [RefreshDate.Eomonth],
EOMONTH('Measure'[RefreshDate],-1),
[RefreshDate.Eomonth]
)
除了刷新时间的度量值准备,还应准备基础度量值,如
Sales = Calculate(sum('table[column]))
2)然后我们开始写最后的度量值
Measure =
//如果选择rolling,则月份往前推12个月;如果选择fy,则建立period表和日期表关系,进行筛选
VAR Vslicer =
SELECTEDVALUE ( Temp_table_timeperiod[period] )
VAR Vrelation =
TREATAS (
VALUES ( Temp_table_timeperiod[period] ),
CalendarTable[Financial Year]
)
var is_LastNotfullMonth = SELECTEDVALUE ( CalendarTable[YearMonth] )
> YEAR ( [Eomonth.fullmonth] ) * 100
+ MONTH ( [Eomonth.fullmonth] )
VAR VresultofFY =
IF(is_LastNotfullMonth,BLANK(),CALCULATE ( [Sales], Vrelation ))
--意思是,如果非完整月,显示为空,否则计算sales
VAR Vresultofrolling1 =
CALCULATE (
[Sales],
FILTER (
ALL ( table[SalesDate] ),
table[SalesDate] - 1
>= EDATE ( [Eomonth.fullmonth], -12 )
)
)
--此处减一,是因为1.31往前推12个月是上年的1.31,加一后就是2.1了,也就是我们要求的日期
VAR Vresultofrolling2 =
IF (
is_LastNotfullMonth,
BLANK (),
Vresultofrolling1
)
--先求了rolling12个月的值,然后做了不显示完整月数据的可视化处理
RETURN
SWITCH (
TRUE (),
Vslicer = "Rolling 12 Months", Vresultofrolling2,
VresultofFY
)