暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

计算同比环比增长 | DAX 模式:关于时间的标准计算

PowerBI最佳实践 2021-08-26
3804


 点击下方,关注我们



关于这个模式




一个常见的需求是将一个时间段与前一年、前一季度或前一个月的相同时间段进行比较。最后一个月/季度/年可能是不完整的; 因此为了实现公平的比较,应该考虑一个相同的时间段进行比较。出于这个原因,正如控制将来日期的显示这一章节描述的那样,本章节中展示的计算使用了 Date [DateWithSales] 计算列。



同比增长




同比(Year-over-Year 或 YOY)是将本期和去年同期进行比较。在这个案例中,Sales 表有数据的最晚日期是 2009/08/15。因此,Sales PY 度量值显示的和 2008 年相关的数字只考虑了 2008/08/15 之前的交易。图5显示,2008年8月的销售额(Sales Amount)为721,560.95,而2009年8月的去年同期销售额(Sales PY )为296,529.51,因为度量值仅考虑了直到 2008/08/15 之前的销售。


图5  对于2009年8月(行 08 2009),Sales PY 度量值显示的是2008年8月1-15日之间的销售额,因为在 2009/08/15 之后没有数据。


为了确保在本期与上期之间比较的时间段相同,Sales PY 度量值使用 DATEADD 并筛选 Date[DateWithSales] 计算列,以避免在最后一个交易日(2009/08/15) 之后的日期上计值。


    Sales PY := 
    CALCULATE (
    [Sales Amount],
    CALCULATETABLE (
    DATEADD ( 'Date'[Date], -1, YEAR ), -- 往前偏移一年
    'Date'[DateWithSales] = TRUE -- 对最后一个交易日(2009/08/15)之前的时期
    )
    )


      Sales YOY :=
      VAR ValueCurrentPeriod = [Sales Amount]
      VAR ValuePreviousPeriod = [Sales PY]
      VAR Result =
      IF (
      NOT ISBLANK ( ValueCurrentPeriod )
      && NOT ISBLANK ( ValuePreviousPeriod ), --仅当本期与去年同期同时有数据时
      ValueCurrentPeriod - ValuePreviousPeriod --计算同比增长
      ) --否则, 返回空值
      RETURN
      Result
        Sales YOY % :=
        DIVIDE (
        [Sales YOY],
        [Sales PY]
        )

        也可以使用 SAMEPERIODLASTYEAR 编写 Sales PY 度量值。SAMEPERIODLASTYEAR 更容易阅读,但是性能上并没有差异。这是因为在 DAX 引擎内部,它被转换成了在前一个公式中使用的 DATEADD 。


          Sales PY (2) := 
          CALCULATE (
          [Sales Amount],
          CALCULATETABLE (
          SAMEPERIODLASTYEAR ( 'Date'[Date] ),
          'Date'[DateWithSales] = TRUE
          )
          )



          季度环比增长




          季度环比(Quarter-over-Quarter 或 QOQ)是将本期和上季度同期进行比较。在这个案例中,Sales 表有数据的最晚日期是 2009/08/15,也就是2009年第三个季度的上半季度。因此,2009年8月的上季度同期(Sales PQ)(第三个季度的第二个月)显示的是直到 2009/05/15 为止的销售,也就是直到上个季度第二个月上半月的销售。图6显示:2009年5月的销售额(Sales Amount)为1,067,165.23,而2009年8月的上季度同期(Sales PQ)销售额因为仅计入了 2009/05/15 之前的销售,返回435,306.10。


          图6  对于2009年8月(行 08 2009),Sales PQ 度量值显示的是2009年5月1-15日之间的销售额,这是因为在 2009/08/15 之后就没有数据了。


          为了确保在本期与上期之间比较的时间段相同,Sales PQ 度量值使用 DATEADD 并筛选 Date[DateWithSales] 计算列。季度环比增长通过 Sales QOQ 度量值作为金额和 Sales QOQ % 度量值作为百分比计算。两个度量值都使用了 Sales PQ 度量值,以确保在同时期进行比较。


            Sales PQ := 
            CALCULATE (
            [Sales Amount],
            CALCULATETABLE (
            DATEADD ( 'Date'[Date], -1, QUARTER ), -- 往前偏移一个季度
            'Date'[DateWithSales] = TRUE -- 对最后一个交易日(2009/08/15)之前的时期
            )
            )
              Sales QOQ :=
              VAR ValueCurrentPeriod = [Sales Amount]
              VAR ValuePreviousPeriod = [Sales PQ]
              VAR Result =
              IF (
              NOT ISBLANK ( ValueCurrentPeriod )
              && NOT ISBLANK ( ValuePreviousPeriod ), --仅当本期与上季度同期同时有数据时
              ValueCurrentPeriod - ValuePreviousPeriod --计算季度环比增长
              ) --否则, 返回空值
              RETURN
              Result

                Sales QOQ % :=
                DIVIDE (
                [Sales QOQ],
                [Sales PQ]
                )


                月环比增长




                月环比(Month-over-Month  或 MOM)是将本期和上月同期进行比较。在这个案例中,Sales 表有数据的最晚日期是 2009/08/15。因此,2009年8月的上月同期(Sales PM)只考虑2009年7月1-15日之间的销售,这样以来,它只返回了上月的对应区间。图7显示:2009年7月的销售额(Sales Amount)为1,068,396.58,而2009年8月的上月同期(Sales PM)销售额因为仅计入了 2009/07/15 之前的销售,返回 584,212.78。


                图7  对于2009年8月(行 08 2009),Sales PM 度量值显示的是2009年7月1-15日之间的销售额,这是因为在 2009/08/15 之后就没有数据了。


                为了确保在本期与上期之间比较的时间段相同,Sales PM 度量值使用 DATEADD 并筛选 Date[DateWithSales] 计算列。月环比增长通过 Sales MOM 度量值作为金额和 Sales MOM % 度量值作为百分比计算。两个度量值都使用了 Sales PM 度量值,以确保在同时期进行比较。


                  Sales PM := 
                  CALCULATE (
                  [Sales Amount],
                  CALCULATETABLE (
                  DATEADD ( 'Date'[Date], -1, MONTH ), -- 往前偏移一个月
                  'Date'[DateWithSales] = TRUE -- 对最后一个交易日(2009/08/15)之前的时期
                  )
                  )
                    Sales MOM :=
                    VAR ValueCurrentPeriod = [Sales Amount]
                    VAR ValuePreviousPeriod = [Sales PM]
                    VAR Result =
                    IF (
                    NOT ISBLANK ( ValueCurrentPeriod )
                    && NOT ISBLANK ( ValuePreviousPeriod ), --仅当本期与上月同期同时有数据时
                    ValueCurrentPeriod - ValuePreviousPeriod --计算月环比增长
                    ) --否则, 返回空值
                    RETURN
                    Result

                      Sales MOM % :=
                      DIVIDE (
                      [Sales MOM],
                      [Sales PM]
                      )


                      下期预告: 计算周期间的增长,你将掌握如何编写基于用户选择的任意周期间的比较。




                      ✎ 获取案例文件 

                      添加公众号,回复"同比环比计算",获得案例文件进行练习。





                      END








                      计算累计至今 | DAX 模式:关于时间的标准计算


                      Power BI | DAX 优化日期表的性能


                      DAX Patterns | 关于时间的标准计算 (2)


                      DAX Patterns | 关于时间的标准计算





                      关注加星,及时获得最新更新”



                      点亮【赞】+【在看】,让更多人看到吧


                      文章转载自PowerBI最佳实践,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论