在 DAX Power BI 中计算没有空白值的 3 个月的移动平均线
Calculating a Moving Average for 3 months without blank values in DAX Power BI
我有 客户服务 table [计费分钟数] 值。
我需要创建[3 个月的移动平均线] 度量,计算将在其中进行
只会发生 - 如果 [计费分钟数] 中所有 3 个月 都存在值!
(见下文)
如果 [计费分钟数] 值在我的 Client Services table 中至少一个月内为空,那么我想要 [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 表达式表示 [移动平均 3 个月]:
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
因此,它将 Client Services table 中的现有值除以周期数。
例如 2018-11、2018-10、2018-09 - 它需要 (200+0+0)/3=66.6(67 四舍五入)
但我需要 Moving Avg 在 2018-11 年为空,因为在客户服务 table 中没有 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)
按照以下步骤操作-
第 1 步: 将您的 Period 列转换为日期,考虑每个月的第一个日期,如下所示-
第 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
)
我有 客户服务 table [计费分钟数] 值。
我需要创建[3 个月的移动平均线] 度量,计算将在其中进行 只会发生 - 如果 [计费分钟数] 中所有 3 个月 都存在值! (见下文)
如果 [计费分钟数] 值在我的 Client Services table 中至少一个月内为空,那么我想要 [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 表达式表示 [移动平均 3 个月]:
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
因此,它将 Client Services table 中的现有值除以周期数。 例如 2018-11、2018-10、2018-09 - 它需要 (200+0+0)/3=66.6(67 四舍五入) 但我需要 Moving Avg 在 2018-11 年为空,因为在客户服务 table 中没有 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)
按照以下步骤操作-
第 1 步: 将您的 Period 列转换为日期,考虑每个月的第一个日期,如下所示-
第 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
)