销售需求丨移动周期汇报

既然已经做了周分析,固定日期汇报,那么,咱们继续做一下移动周期汇报!既然已经做了,那就做到最好!

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 () )

修改一下日期间隔就好,结果如下:

小伙伴们,这就得出了我们想要的结果了。(因为最开始参数没选择,所以模型默认是错误的,选择参数即可。)至于其他的比率的变化,这里就不赘述了。

(BOSS:哎呦,不错哦!)

小伙伴们❤GET了么?

白茶会不定期的分享一些函数卡片

(文件在知识星球[PowerBI丨需求圈])

这里是白茶,一个PowerBI的初学者。

下面这个知识星球是针对有实际需求的小伙伴,有需要的请加入下面的知识星球。

请在PC端查看,有部分图片无法在移动端显示。
PowerBI丨白茶