【问题标题】:Calculating a Moving Average for 3 months without blank values in DAX Power BI在 DAX Power BI 中计算 3 个月没有空白值的移动平均线
【发布时间】:2020-09-30 02:50:40
【问题描述】:

我有 [Billable Minutes] 值的 客户服务 表。

我需要创建 [3 个月的移动平均线] 度量,计算将在其中 仅发生 - 如果在 [计费时间] 中存在所有 3 个月的值! (见下文)

如果 [Billable Minutes] 值在我的 Client Services 表中至少一个月内为空,那么我想要 [Moving Avg]将显示 0 或空白!

我的目标:

        Client Services table:                              Result:

       Period     [Billable Minutes]                       Period     [Moving Avg]
       2018-11                   200                       2019-01             200  
       2018-12                   300
       2019-01                   100
       

为了实现我的目标,我将以下 DAX 表达式用于[Moving Avg 3 months]:

     Moving Avg 3 month = 
      
      VAR PeriodToUse = DATESINPERIOD('Calendar FY'[Date], LASTDATE('Calendar FY'[Date]), -3, MONTH)
      VAR Result = CALCULATE(DIVIDE([Billable Minutes], COUNTROWS ('Calendar FY')), PeriodToUse) 
      VAR  ZeroValue=IF(Minx('Client Services',[Billable Minutes])=0,0,Result)                                
         
         Return Result

但是,不幸的是,我的最终结果是:

        Client Services table:                              Result:

       Period     [Billable Minutes]                       Period     [Moving Avg]
       2018-11                   200                       2018-11             67  
       2018-12                   300                       2018-12            167
       2019-01                   100                       2019-01            200
     

因此,它采用 客户服务 表中的现有值并将它们除以期间数。 例如对于 2018-11、2018-10、2018-09 - 它需要 (200+0+0)/3=66.6(67 舍入) 但我需要 Moving Avg 对于 2018-11 为空,因为客户服务表中没有 2018-10、2018-09 的值(相同 - 对于 2018-12,不应该计算)

请帮忙!

更新:

这是解决方案(感谢下面的答案) 为了检查所选期间是否为零,应创建额外的措施:

     Billable Minutes 
     Moving Avg Prev Month = Calculate('Client Services'[Billable Minutes], 
                                        PREVIOUSMONTH('Calendar FY'[Date]))
                       
     Billable Minutes 
    Moving Avg 2nd Prev Month = Calculate
                             ('Client Services'[Billable Minutes Prev Month], 
                                        PREVIOUSMONTH('Calendar FY'[Date]))

然后,当您检查是否有零值时-您需要检查它-不是 仅适用于 [Billable Minutes],但适用于 3 个月内的 [Billable Minutes] = 之内 [计费分钟数]+[上月计费分钟数]+ [上月第 2 个月的计费时间]

查看下面的更新(完美运行):

enter 
     Billable Minutes 3 Months Avg = 

      VAR PeriodToUse = DATESINPERIOD('Calendar FY'[Date], 
                        LASTDATE('Calendar FY'[Date]), -3, MONTH)
      VAR Result = CALCULATE(DIVIDE([Billable Minutes], 
                        COUNTROWS ('Calendar FY')), PeriodToUse)                                                                                                                      
      VAR NMonthsPeriodBlank = 
         if([Billable Minutes] = BLANK(),0,1) + 
         if([Billable Minutes Prev Month] = BLANK(),0,1) + 
         if([Billable Minutes 2nd Prev Month] = BLANK(),0,1)                                       

          RETURN IF(NMonthsPeriodBlank < 3, BLANK(), Result)

  

【问题讨论】:

    标签: powerbi dax moving-average isnullorempty


    【解决方案1】:

    按照以下步骤-

    第 1 步:考虑到每个月的第一个日期,将您的 期间 列转换为日期,如下所示-

    第 2 步:点击关闭并应用返回报告并在下面创建 4 个措施-

    total = SUM('Client Services'[Billable Minutes])
    
    total prev = CALCULATE([total],PREVIOUSMONTH('Client Services'[Period]))
    
    total second prev = CALCULATE([total prev],PREVIOUSMONTH('Client Services'[Period]))
    
    3 month avergae = 
    
    VAR devide_by = if([total] = BLANK(),0,1) + if([total prev] = BLANK(),0,1) + if([total second prev] = BLANK(),0,1)
    VAR total_amount = [total] + [total prev] + [total second prev]
    
    RETURN IF(
        devide_by < 3,
        BLANK(),
        total_amount/devide_by
    )
    

    这是最终的输出-

    ===================== 单一措施解决方案 ====================

    您可以将所有度量转换为 1 个度量,如下所示-

    3 month average new = 
    
    VAR this_month = SUM('Client Services'[Billable Minutes])
    
    VAR prev_month = 
    CALCULATE(
        SUM('Client Services'[Billable Minutes]),
        PREVIOUSMONTH('Client Services'[Period])
    )
    
    VAR second_prev_month = 
    CALCULATE(
        SUM('Client Services'[Billable Minutes]),
        PREVIOUSMONTH(
            DATEADD(
                'Client Services'[Period],
                -1,
                MONTH
            )
        )
    )
    
    VAR devide_by = 
    if(this_month = BLANK(),0,1) + 
    if(prev_month = BLANK(),0,1) + 
    if(second_prev_month = BLANK(),0,1)
    
    VAR total_amount = this_month + prev_month + second_prev_month
    
    RETURN IF(
        devide_by < 3,
        BLANK(),
        total_amount/devide_by
    )
    

    【讨论】:

    • 其实,我明白你的意思了——让我明天试试,如果成功我会发帖的!
    • 希望它对你有用。如果有帮助,请接受答案并投赞成票:)
    • 谢谢你,这个想法成功了!我将使用修改后的代码更新我的原始帖子。仍然有一个小问题 - 如果我需要 6 个月或 12 个月的平均值,我需要创建 6 或 12 个额外的措施 - 为前 3 个月、第 4 个月、第 5 个月等。只是想知道是否有更优雅的方式来实现这。将继续研究 - 但再次感谢,您的想法帮助了很多!
    • @Hell-1931,这也可以使用单一度量。我使用单独的措施只是为了清楚地向您展示这个想法,请使用单一措施选项检查我的更新答案。
    • 你可以看到我有-1个月的时间来获得前第二个月。您现在可以添加更多 VAR 并使用 -2、-3... 转到上个月的第 3/4 个月。
    猜你喜欢
    • 2020-08-23
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2021-10-04
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多