从日期角度分析问题,在Power BI中用DAX实现基本上会基于时间智能函数处理。
由于PowerBI DAX中时间智能函数众多,有必要梳理形成一个统一的模式。它能帮助业务(尤其常常是财务)解决的问题包括但不限于:
- 本期至今指标(XTD):年度至今(YTD),季度至今(QTD),月度至今(MTD)等
- 上期同期指标:上年同期,上季同期等
- 上期全部
- 基于时间区间的对比
订单指标集
以示例目的,选择订单作为业务对象,其常见指标集包括:
- 订单 销售额 合计
- 订单 利润率 合计
- 订单 数量
为了使用方便,设置一个 动态的 订单指标,包括以上所有指标,称为 [订单 指标]。
日期表系列
首先介绍 日期表,初次接触PowerBI DAX会认为日期表是一个多列的表,其实日期表的最简单形式仅仅是一个 单列日期 构成的表,如果用DAX来实现,只需要写:
日期表 = CALENDAR( 开始年份 , 结束年份 )
即可。由于这种单列的日期表不能满足复杂的实际业务需求,包括从不同的日期粒度(日,周,月,季,年等)来计算指标以及一些动态灵活的需要,这里总结常用的三种日期表,如下:
关于日期表的讨论不再赘述。
日期表可以采用DAX公式或Power Query公式均可构建,以上范例提供了详细完整的Power Query公式构建方法。
为了集中于本案例,这里只使用日期表,并使用[订单 指标]度量值作为示例。
本期至今 YTD,QTD,MTD,WTD
常用的本期至今指标包括包括本年至今(Year To Date),本季至今(Quarter To Date),本月至今(Month To Date),本周至今(Week To Date),计算如下:
WTD并非有类似的函数,因此需要自行构建,如下:
💬 提示
TOTALYTD、TOTALQTD、TOTALMTD有等价的写法,可以仅使用上述方法。
上期同期 PY,PQ,PM
常用的上期同期指标包括上年同期(Previous Year),上季同期(Previous Quarter),上月同期(Previous Month),上周同日(7日前),计算如下:
💬 提示
SAMEPERIODLASTYEAR 可产生与 DATEADD ( '日期'[Date], -1, YEAR ) 同样的效果。
很少有上周同期的业务叫法,更适合称为【7日前指标】,就其本质也是上周同期的概念,故放在这类指标中。
上期全部 PYT,PQT,PMT,PWT
与 上期同期 不同,上期全部 将获取到上期的全部日期,例如:2017年5月的上年同期是2016年5月,而2017年5月的上年全部是2016年全年。常用的指标包括:上年全部(Previous Year Total),上季全部(Previous Year Total),上月全部(Previous Year Total),上周全部(Previous Week Total),计算如下:
可以看出,这里对有关周的计算已经变得更加复杂。DAX时间智能函数一般实现到月的级别,因为对于周的处理是并没有统一的方案的,在国际上也存在一些标准方案,实际还是根据不同公司的业务周期或考核周期进行,会有实际差别。
基于时间区间的对比
将当前与过去的不同时间区间进行对比可以得出一些重要的指标,包括:
- 本年至今 对比 上年全部;
- 当期 对比 全年同期 形成同比;
- 当期 对比 上期 形成环比;
- 差异的增长率。
根据实际业务的需要还可能产生更多的排列组合,这里仅列举上述常用指标计算,如下:
总结
上述内容的讨论暂未涉及期初期末类,以及并为详细展开关于周有关的计算,它们都可以专门来进行讨论。对于偏向技术类的业务人员,关于时间智能可以注意以下几点重要内容:
- 时间智能函数通常作为 CALCULATE 的筛选器参数
- CALCULATE 的筛选器参数都是表(ALL及设置关系类除外,此处不需了解)
- 因此所有时间智能类函数都返回表
这其实在说,例如: LASTDATE( 日期[日期] ) 是时间智能函数;而时间智能函数其实返回的是表(虽然LASTDATE从字面意思上是一个值,由于它是一行一列的表,因此也可以作为值,但本质是表)。
时间智能函数还有一些需要注意的问题:
- 时间智能函数 不一定必须 配合日期表,但最好有独立的日期表,而不使用系统自带的
- 日期表应该尽量用日期类型的列作为关系列
案例下载:
链接:https://pan.baidu.com/s/1Q-qjFk3CXG-spTnUhe5aNQ
密码:biw7
网友评论