加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,提问交流,有问必答。
社会越来越卷,节奏越来越快,很多销售团队会以周作为销售追踪的周期,每周开周会都要看过来这一周对比上周的销量增长情况,需要在报告中给出个周环比增长率。问题是在PowerBI中计算上周销量的时候,发现平时使用的时间智能函数DATEADD,只支持按年/季/月/日平移时间段,没有周这个选项。该如何写周环比这个度量值呢?
解决方案
只要给日期表中的周做个从小到大的排序,取上周就是取当周对应的序号减1,就这么简单。这个周排序,第一章的《复制粘贴PowerQuery代码,生成多功能日期表》,已经一步到位生成了,按跨年和不跨年有Week_Offset和YearWeek_Offset两列。如果不想切换日期表,也可以通过DAX快速生成两列周排序。
操作步骤
STEP 1 日期表中要具备这些列:年、周序号(周在年内的序号)、每周第一天的日期、周几(用来辅助检查)。通过DAX生成这些计算列如下:
年:
Year = YEAR([Date])
周序号(周在年内的序号):
WeekOfYear = WEEKNUM([Date],2)
周几:
DayOfWeek = WEEKDAY([Date],2)
每周第一天的日期(以周一为例):
StartOfWeek = [Date]-WEEKDAY([Date],2)+1
其中,WEEKNUM函数和WEEKDAY函数的第二个参数,可以切换每周第一天是周几,2代表周一,1代表周日;每周第一天的日期是用当前日期减去周几与周一的间隔得到的。
STEP 2使用RANK函数新增年周序号和周序号。
年周序号:
YearWeek_Order =
RANK(
DENSE,
ALL(Dim_Date[Year],Dim_Date[WeekOfYear]),
ORDERBY([Year],ASC,[WeekOfYear],ASC)
)
周序号:
Week_Order =
RANK(
DENSE,
ALL(Dim_Date[StartOfWeek]),
ORDERBY([StartOfWeek],ASC)
)
STEP 3 基于年周序号/周序号书写上周销量和周环比的度量值。
销量:
Sales = SUM(Fact_Sales[数量])
上周销量(不跨年):
Sales_LastYearWeek =
CALCULATE([Sales], FILTER(ALL(Dim_Date), [YearWeek_Order]=MAX(Dim_Date[YearWeek_Order])-1))
周环比增长率(不跨年):
WoW Gr%_YearWeek = DIVIDE([Sales]-[Sales_LastYearWeek],[Sales_LastYearWeek])
上周销量(跨年):
Sales_LastWeek =
CALCULATE([Sales], FILTER(ALL(Dim_Date), [Week_Order]=MAX(Dim_Date[Week_Order])-1))
周环比增长率(跨年):
WoW Gr%_Week = DIVIDE([Sales]-[Sales_LastWeek],[Sales_LastWeek])
拓展
这种方法在物理表中新建了辅助列,回归到环比修改上下文到上一个的本质,清除日期表的筛选,然后平移日期时间段,易于理解,操作也不难。窗口函数也可以很便捷地实现环比计算,后续介绍窗口函数时会做讲解。