首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DAX Power BI中无空白值的3个月移动平均计算

DAX Power BI中无空白值的3个月移动平均计算
EN

Stack Overflow用户
提问于 2020-09-30 02:50:40
回答 1查看 1.8K关注 0票数 0

我有客户服务表,其中有可计费分钟值。

我需要创建移动平均3个月的度量,那里的计算只会发生-如果在所有3个月的中有值的话,可计费分钟存在!(见下文)

如果可计费分钟值在我的客户服务表中至少在一个月内为空白,那么我希望Moving Avg显示0或空白!

我的目标是:

代码语言:javascript
复制
        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个月

代码语言:javascript
复制
     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

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

代码语言:javascript
复制
        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

因此,它接受Client Services表中的一个现有值,并将其除以句点数。例如,2018-11、2018-10、2018-09 -它需要(200+0+0)/3=66.6 (67四舍五入),但我需要移动Avg在2018-11中为空,因为客户服务表中没有2018-10、2018-09的值( 2018-12的值相同,不应该计算)

求你了救命!

更新:

下面是这个问题的解决方案(下面的答案是这样),为了检查所选期间是否为零,应该创建额外的度量:

代码语言:javascript
复制
     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]))

然后,当您检查是否有零值时--您需要检查它--不仅要检查可计费的分钟,还要检查3个月内的可计费分钟=在可计费的Minutes+Billable分钟内,Month+可计费分钟的第二个Prev月。

见以下更新(工作完美):

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-30 04:33:29

按照以下步骤-

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

步骤-2:返回报告,单击Close & Apply并创建下面的4度量值-

代码语言:javascript
复制
total = SUM('Client Services'[Billable Minutes])
代码语言:javascript
复制
total prev = CALCULATE([total],PREVIOUSMONTH('Client Services'[Period]))
代码语言:javascript
复制
total second prev = CALCULATE([total prev],PREVIOUSMONTH('Client Services'[Period]))
代码语言:javascript
复制
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度量,如下所示-

代码语言:javascript
复制
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
)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64130162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档