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

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

PowerBI最佳实践 2021-08-26
3337

 点击下方,关注我们



关于这个模式




年初至今、季度初至今和月初至今的计算修改 Date 表的筛选上下文,应用一系列日期作为筛选器,覆盖所选时间段的筛选器。所有的这些计算都可以使用带有时间智能函数的常规 CALCULATE,或者诸如 TOTALYTD 的 TOTAL 类函数来实现。TOTAL 类函数仅是 CALCULATE 版本的语法糖形式,虽然我们更喜欢 CALCULATE 版本,但是我们将作为参考展示它们 —— 实际上,使用 CALCULATE 使公式的逻辑更加清晰,并且它提供了比 TOTAL 类函数更大的灵活性。使用 TOTAL 类函数的公式在下面的例子中标记为(2)。展示它们的目的仅仅是为了表明它们返回的值与 CALCULATE 版本相同。



年初至今累计




如下图所示,年初至今计算从当年的1月1日开始汇总数据。


图1  Sales YTD (simple) 在每个时间段上显示值, 而 Sales YTD 和 Sales YTD (2) 隐藏了最后一个有数据的时间段之后(>2009/08/15)的值.


可以使用 DATESYTD 函数计算年初至今累计,代码如下:


    Sales YTD (simple) :=
    CALCULATE (
    [Sales Amount],
    DATESYTD ( 'Date'[Date] )
    )


    DATESYTD 返回一组连续日期,其从当前年份的第一天开始,直到在当前筛选上下文中可见的最后一天结束。因此,Sales YTD (simple) 度量值对于当前年份的将来日期也显示了值。我们可以通过只有当 ShowValueForDates 度量值返回 TRUE 时才能返回结果的方式,在 Sales YTD 度量值中避免这种行为:


      Sales YTD :=
      IF.EAGER (
      [ShowValueForDates],
      CALCULATE (
      [Sales Amount],
      DATESYTD ( 'Date'[Date] )
      )
      )


      如果报表是基于一个与公历年不一致的财年,则 DATESYTD 需要另外一个参数来确定财年的最后一天。以图2中的报表为例。


      图2  Sales Fiscal YTD 和 Sales Fiscal YTD (2) 显示了基于财年的年初至今累计


      Sales Fiscal YTD 度量值在 DATESYTD 的第二个参数中指定财年的最后一天和最后一个月。它使用 06-30 作为财年的最后一天。DATESYTD 的第二个参数必须是一个常量值(也称为文字),对应于 Date 表中财年的定义;它不能通过动态计算得到。


        Sales Fiscal YTD :=
        IF.EAGER (
        [ShowValueForDates],
        CALCULATE (
        [Sales Amount],
        DATESYTD ( 'Date'[Date], "6-30" )
        )
        )


        TOTALYTD 是 DATESYTD 的一个可能替代方案:


          Sales YTD (2) :=
          IF.EAGER (
          [ShowValueForDates],
          TOTALYTD (
          [Sales Amount],
          'Date'[Date]
          )
          )


            Sales Fiscal YTD (2) :=
            IF.EAGER (
            [ShowValueForDates],
            TOTALYTD (
            [Sales Amount],
            'Date'[Date],
            "6-30"
            )
            )



            季度初至今累计




            如下图所示,季度初至今计算从本季度的第一天开始汇总数据。


            图3-1  Sales QTD (1) 显示了季度至今的累计金额, 因为在 Q4-2009 没有数据,所以在 2009 年这一行是空值。


            使用 DATESQTD 函数计算季度初至今累计的度量值如下:


              Sales QTD (1) :=
              IF.EAGER (
              [ShowValueForDates],
              CALCULATE (
              [Sales Amount],
              DATESQTD ( 'Date'[Date] )
              )
              )


              在年份的层级上,Sales QTD (1) 度量值正在显示当前年度最后一个季度的销售额,而在季度的层级上,值表示本季度的销售额,这些值没有意义。因此,很有必要使用一个条件语句判断只有在当前筛选上下文中仅仅选择一个月份时才进行计算,否则返回空值。优化后的 Sales QTD 度量值如下:


                Sales QTD = 
                IF.EAGER (
                AND (
                HASONEVALUE ( 'Date'[Month] ),
                [ShowValueForDates]
                ),
                CALCULATE (
                [Sales Amount],
                DATESQTD ( 'Date'[Date] )
                )
                )


                TOTALQTD 是 DATESQTD 的一个可能替代方案:


                  Sales QTD (2) = 
                  IF.EAGER (
                  AND (
                  HASONEVALUE ( 'Date'[Month] ),
                  [ShowValueForDates]
                  ),
                  TOTALQTD (
                  [Sales Amount],
                  'Date'[Date]
                  )
                  )


                  结果如下图:


                  图3-2  Sales QTD   Sales QTD (2) 显示了季度至今的累计金额, 因为使用了 IF.EAGER 保护公式,所以在季度以及以上层级和将来日期上(>2009/08/15)都显示了空值。



                  月初至今累计




                  如下图所示,月初至今计算从本月的第一天开始汇总数据。


                  图4  Sales MTD  显示了月初至今的累计金额,因为使用了 IF.EAGER 保护公式,所以在月份以及以上层级和将来日期上(>2009/08/15)都显示了空值。


                  使用 DATESMTD 函数计算月初至今累计的度量值如下:


                    Sales MTD = 
                    IF.EAGER (
                    AND (
                    HASONEVALUE ( 'Date'[Date] ),
                    [ShowValueForDates]
                    ),
                    CALCULATE (
                    [Sales Amount],
                    DATESMTD ( 'Date'[Date] )
                    )
                    )


                    TOTALMTD 是 DATESMTD 的一个可能替代方案:


                      Sales MTD (2) = 
                      IF.EAGER (
                      AND (
                      HASONEVALUE ( 'Date'[Date] ),
                      [ShowValueForDates]
                      ),
                      TOTALMTD (
                      [Sales Amount],
                      'Date'[Date]
                      )
                      )



                      总结




                      尽管可以使用 TOTAL 类函数计算累计至今,但为了使公式的逻辑更加清晰和提供更大的灵活性,我们强烈建议你使用以下模式计算累计至今:

                      根据计算要求,选择 DATESYTDDATESQTDDATESMTD 中的其中一个作为 CALCULATE 的筛选器参数。




                      获取案例文件 

                      添加公众号,回复"累计至今计算",获得案例文件进行练习。





                      END








                      一文彻底搞懂 DAX 中的数据沿袭 ( 干货 | 修订 )


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


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


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







                      “提醒下哦,阅读过的小伙伴们都关注并加星了,在高手之路上可不要掉队哦”



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

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

                      评论