美文网首页数据分析
细数计算去年同期的种种陷阱

细数计算去年同期的种种陷阱

作者: 一叶云秋 | 来源:发表于2019-10-13 10:30 被阅读0次

    前言

    去年同期和同比是日常业务中常见的计算指标,但是就是这么简单的业务指标也往往充满了陷阱。日常工作中,经常不是在月末就需要查看去年同期值了,如果简单的使用SAMEPERIODLASTYEAR往往会得到错误的结论。

    常见情况

    举个例子

    通常情况下,大家会使用以下表达式计算去年同期

    总销售额.PY =
    CALCULATE ( 
        [总销售额], 
        SAMEPERIODLASTYEAR ( '日期'[日期] ) 
    )
    

    通过此度量值,可以在报告中查看当年销售额和去年同期销售额

    P1_基本计算.png

    但是这种方式并不完美,检查源数据,不难发现9月14日之后并未发生销售行为,即订单数据仅到2019年9月14日为止。但是度量值总销售额.PY在2018年9月的计算中,计算了整个9月的销售额,这样比较时不公平的,容易产生错误的结论。

    解决方案

    所以这时就需要增加一个计算条件,用于限制2018年的销售额,使其仅计算到2018年9月14日为止(即最后一天发生销售额的去年同期)。表达式如下:

    总销售额.PY.考虑订单日期 =
    VAR LastOrderDate =
        LASTDATE ( '订单_2019不完整'[订单日期] )
    VAR LastOrderDatePY =
        EDATE ( LastOrderDate, -12 )
    RETURN
        CALCULATE (
            [总销售额],
            SAMEPERIODLASTYEAR ( '日期'[日期] ),
            '日期'[日期] <= LastOrderDatePY
        )
    

    我们放图中进行对比。

    P2_进阶计算.png

    显然这样算出的去年同期值会合理的多,更能反应事实。

    其他情况

    那么会不会有其他类似的情况?必须有啊,例如常用的指标年累计值( Year to date ),同样会有这样的陷阱,常见的写法如下。

    总销售额.YTD =
    CALCULATE ( 
        [总销售额], 
        DATESYTD ( '日期'[日期] ) 
    )
    

    同时去年年累计会按照如下写法所示:

    总销售额.YTD.PY = 
    CALCULATE(
        [总销售额.YTD],
        SAMEPERIODLASTYEAR('日期'[日期])
    )
    

    那么结果如下:

    P3_YTD基本.png

    显然按照这种结果比较,完全无法得出正确结论,所以改写YTD和去年同期YTD的表达式:

    销售额.YTD.考虑订单日期 = 
    IF(
        FIRSTDATE('日期'[日期])>LASTDATE('订单_2019不完整'[订单日期]),
        BLANK(),
        [总销售额.YTD]
    )
    
    销售额.YTD.PY.考虑订单日期 =
    VAR LastOrderDate =
        LASTDATE ( '订单_2019不完整'[订单日期] )
    VAR LastOrderDatePY =
        EDATE ( LastOrderDate, -12 )
    RETURN
        CALCULATE (
            [总销售额.YTD],
            SAMEPERIODLASTYEAR ( '日期'[日期] ),
            '日期'[日期] <= LastOrderDatePY
        )
    

    于是得到了如下结果:

    P4_YTD进阶.png

    总结

    像文中这样的陷阱,日常工作中还有很多,希望各位能多多留意,避免得出错误结论。

    相关文章

      网友评论

        本文标题:细数计算去年同期的种种陷阱

        本文链接:https://www.haomeiwen.com/subject/irxtuctx.html