既然已经做了周分析,固定日期汇报,那么,咱们继续做一下移动周期汇报!既然已经做了,那就做到最好!
BOSS:就是就是!这还用我说么?
白茶:......你走开!
先来看看本期的示例文件:
(示例文件会放到知识星球中,小伙伴们可以搜索“PowerBI丨需求圈”,文章结尾处会有二维码。)
将其导入到PowerBI中,结果如下:
编写基础的代码如下:
聚合 =
SUM ( '示例'[销售金额] )
结果如图:
到这里,准备工作基本完成。
开始思考一下思路。这道题的难点在于什么,在于判定最新日期!
首先要考虑这个固定的时间节点,让其不受筛选上下文影响。那么该使用哪个函数呢?小伙伴思考一下。
1
2
3
4
5
有的小伙伴说了,可以用MAX函数,因为它可以MAX文本。白茶说一下,这么说MAX函数也没有错误,但是MAX函数受当前上下文影响哦。继续思考。
1
2
3
4
5
现在可以公布答案:想跳出当前筛选上下文,那么就需要判定行上下文的最新日期值。判定行上下文属于什么?迭代啊!所以,正确答案是用MAXX函数(或者是其他迭代函数,比如MINX函数)!
迭代的问题解决了,那么接下来的就好弄了,算移动日期可以使用正常的加减法就行,也可以使用时间智能函数,当然TOPN也是可以的。
这里说一下,使用时间智能函数日期必须是连续不间断的,需要添加自己的日期表。用TOPN可以忽略日期挂蛋的问题,一切以事实表数据为基础,小伙伴们可以根据自己的需求自行选择。
编写如下代码:
周期 =
VAR CQ =
MAXX ( ALL ( '示例'[日期] ), '示例'[日期] )
VAR SQ =
SELECTEDVALUE ( '示例'[日期] )
VAR DQ =
TOPN ( 1, FILTER ( ALL ( '示例'[日期] ), '示例'[日期] = SQ - 7 ), '示例'[日期], DESC )
VAR LS =
CALCULATE (
'示例'[聚合],
FILTER ( ALL ( '示例'[日期] ), '示例'[日期] <= SQ && '示例'[日期] > DQ )
)
RETURN
LS
结果放在TABLE中查看:
右边TABLE的计算结果没什么问题,但是显示的不对,想按照之前的方式显示,只显示最新日期以及相隔七天的累计值,这种情况该怎么处理呢?
(白茶想说:@冬哥威武!)
有请MOD函数!
语法=
MOD(<number>, <divisor>)
MOD函数的第一参数是被除数,第二参数是除数,结果返回的是余数。需要注意的是除数不能为0。
修改代码如下:
七日周期 =
VAR CQ =
MAXX ( ALL ( '示例'[日期] ), '示例'[日期] )
VAR SQ =
SELECTEDVALUE ( '示例'[日期] )
VAR DQ =
TOPN ( 1, FILTER ( ALL ( '示例'[日期] ), '示例'[日期] = SQ - 7 ), '示例'[日期], DESC )
VAR LS =
CALCULATE (
'示例'[聚合],
FILTER ( ALL ( '示例'[日期] ), '示例'[日期] <= SQ && '示例'[日期] > DQ )
)
RETURN
IF ( MOD ( CQ - SQ, 7 ) = 0, LS, BLANK () )
结果如下:
这次显示的没有任何问题,解释一下代码含义:
CQ在这里是跳出筛选上下文,利用MAXX函数迭代行上下文获取最新日期。
SQ是利用SELECTEDVALUE函数智能匹配当前上下文的数值。
DQ是利用TOPN函数,返回固定间隔的日期。
LS利用CALCULATE+FILTER函数的经典模式分别求出各个时间段的累计值。
最后,IF利用MOD函数判断余数是否为0,如果日期正好间隔7天,那么数据显示,否则显示空。
小伙伴们,明白了么?修改一下代码,求出上期:
七日上期 =
VAR CQ =
MAXX ( ALL ( '示例'[日期] ), '示例'[日期] )
VAR SQ =
SELECTEDVALUE ( '示例'[日期] )
VAR DQ =
TOPN ( 1, FILTER ( ALL ( '示例'[日期] ), '示例'[日期] = SQ - 7 ), '示例'[日期], DESC )
VAR LS =
CALCULATE (
'示例'[聚合],
FILTER ( ALL ( '示例'[日期] ), '示例'[日期] <= SQ-7 && '示例'[日期] > DQ-7 )
)
RETURN
IF ( MOD ( CQ - SQ, 7 ) = 0, LS, BLANK () )
结果如图:
这里修改一下时间间隔就可以了。原本到这里是可以结束的,但是!还有最后一个问题,移动!所以咱们继续。
根据自己的需求,添加属于自己的参数值,修改代码如下:
移动周期 =
VAR CQ =
MAXX ( ALL ( '示例'[日期] ), '示例'[日期] )
VAR SQ =
SELECTEDVALUE ( '示例'[日期] )
VAR DQ =
TOPN (
1,
FILTER ( ALL ( '示例'[日期] ), '示例'[日期] = SQ - [移动周期 值] ),
'示例'[日期], DESC
)
VAR LS =
CALCULATE (
'示例'[聚合],
FILTER ( ALL ( '示例'[日期] ), '示例'[日期] <= SQ && '示例'[日期] > DQ )
)
RETURN
IF ( MOD ( CQ - SQ, [移动周期 值] ) = 0, LS, BLANK () )
修改上期代码:
移动上期 =
VAR CQ =
MAXX ( ALL ( '示例'[日期] ), '示例'[日期] )
VAR SQ =
SELECTEDVALUE ( '示例'[日期] )
VAR DQ =
TOPN (
1,
FILTER ( ALL ( '示例'[日期] ), '示例'[日期] = SQ - [移动周期 值] ),
'示例'[日期], DESC
)
VAR LS =
CALCULATE (
'示例'[聚合],
FILTER (
ALL ( '示例'[日期] ),
'示例'[日期] <= SQ - [移动周期 值]
&& '示例'[日期] > DQ - [移动周期 值]
)
)
RETURN
IF ( MOD ( CQ - SQ, [移动周期 值] ) = 0, LS, BLANK () )
修改一下日期间隔就好,结果如下:
小伙伴们,这就得出了我们想要的结果了。(因为最开始参数没选择,所以模型默认是错误的,选择参数即可。)至于其他的比率的变化,这里就不赘述了。
小伙伴们,GET了么?
(BOSS:哎呦,不错哦!)
网友评论