零售、电商、教育等领域的诸多业务场景中需要按周进行分析,然而Power BI并未提供周粒度的时间智能函数,这让很多人想分析时感觉力不从心、无从下手。
今天我们就来说一说按周分析的几个思路,希望能够帮各位打开思想的束缚,发挥更大的创造力,更好地助力业务发展。
按周进行分析,首先需要创建一个日期表(关于日期表创建的多种方式可参考这篇文章:Power BI创建日期表的几种方式概览),或者在已有日期表中新建列“WEEKDAY”和“WEEKNUM”:
有了周的信息,我们就可以按周进行分析了,先拖一个矩阵看看:
列是星期1到星期7,行是一年的各个周,大概有了初步的样子。
不过,你要做成这样直接给老板,估计老板一巴掌就能把你拍死,啥玩意儿这是。所以我们来稍微美化一下。
先看行上,光秃秃的数字不好看,我们可以添加一下说明:
如果你还想显示这个周到底是哪些日期:
你可以写一个这样的度量值:
代码语言:javascript复制周数日期 =
VAR thisweeknum='日期'[年周数]
VAR firstdayofthisweek=CALCULATE(MIN('日期'[Date]),FILTER(ALLEXCEPT('日期','日期'[年度]),'日期'[年周数]=thisweeknum))
VAR monthday1=CALCULATE(MAX('日期'[月份]),FILTER(ALL('日期'),'日期'[Date]=firstdayofthisweek))&"."&CALCULATE(MAX('日期'[日]),FILTER(ALL('日期'),'日期'[Date]=firstdayofthisweek))
VAR lastdayofthisweek=CALCULATE(MAX('日期'[Date]),FILTER(ALLEXCEPT('日期','日期'[年度]),'日期'[年周数]=thisweeknum))
VAR monthday2=CALCULATE(MAX('日期'[月份]),FILTER(ALL('日期'),'日期'[Date]=lastdayofthisweek))&"."&CALCULATE(MAX('日期'[日]),FILTER(ALL('日期'),'日期'[Date]=lastdayofthisweek))
RETURN "("&monthday1&"-"&monthday2&")"
然后在把两列合为一列,或者干脆直接一列搞定也可以。
再看列,按照习惯我们一般用汉字,所以:
代码语言:javascript复制周几 =
SWITCH(
'日期'[周几.数字],
1,"周一",
2,"周二",
3,"周三",
4,"周四",
5,"周五",
6,"周六",
7,"周日"
)
这样是不是就好多了:
不过,细心的你已经发现了,列的排序是乱的,并不是按照周一到周日或者周日到周六的顺序排的。很明显,此时要排序,结果发现列是不支持直接排序的:
所以我们需要用到一个初学者经常会问的【按列排序】了。选中“周几”,点击按列排序,按WEEKDAY进行排列,是不是符合你的要求了:
再经过一些恰当的修饰,就得到了一个比较美观的按周展示的矩阵了:
当然,仅看销售额数据自然是不够的,中国式复杂报表要求我们必须同时查看大量的信息,比如:
你也可以通过柱状图和折线图的方式进行同比环比分析:
这样你就可以从容应对中国式复杂报告的周分析了。
再多说一点,如果你嫌上表第一列的宽度太大,而又想同时包含这些信息,那么你可以通过手动调整列宽的方式将其分为两行:
不过,我们一般是不建议这么做的。自动调整列宽对于绝大部分矩阵来说是很必要的,否则可能会出现领导打开报告看到的是这样一幅画面:
那有没有办法既让矩阵自动调整列宽,又让首列自动分为两行呢?
答案是肯定的:
如何实现呢?敬请关注学谦数据运营,下回分解。