DAX滚动平均值在表格总计行无值的原因及相关疑问
一、总计行无结果的原因分析
针对Rolling 6M Sales Amount度量值
总计行计算时,MAX(Dim_DateTable[dte])会返回整个日期表的最大日期,而lastSalesDate是销售表的最大交易日期。如果日期表的最大日期晚于销售数据的最后日期,IF(firstVisibleDate <= lastSalesDate)这个条件就不成立,直接返回空值。另外就算条件成立,AVERAGEX(VALUES(Dim_DateTable[Month Of Year]), [Sales Amount])在总计行是计算所有月份的销售金额平均值,但如果某些月份没有销售数据,[Sales Amount]返回空,也会导致最终结果为空。
针对Rolling 6M Sales Amount B度量值
总计行上下文里,MAX(Dim_DateTable[dte])取的是日期表全局最大日期,DATESINPERIOD生成的区间是从这个全局最大日期往前推6个月。如果这个区间里没有任何销售数据,[Sales Amount]返回空,除以6之后还是空值。另外,就算区间内有数据,这个度量值的逻辑是“滚动总和除以固定6”,但总计行的滚动总和是整个区间的所有销售总和,本身逻辑就不符合常规总计的预期,同时如果区间超出销售数据范围,也会返回空。
对比SUM函数能正常显示总计,是因为SUM在总计行直接计算所有销售数据的总和,不受日期表上下文的限制,只要有销售数据就会返回结果。
二、卡片视觉对象显示滚动平均值快照值的方法
要在卡片里显示最新的滚动平均值快照,核心是让度量值计算最新销售日期对应的6个月滚动平均,可以通过以下方式修改:
基于第一个度量值修改
Rolling 6M Sales Snapshot = VAR numOfMonths = 6 VAR lastSalesDate = MAX(Fact_SalesInvoice[Value Date]) VAR period = DATESINPERIOD(Dim_DateTable[dte], lastSalesDate,-numOfMonths,MONTH) VAR result = CALCULATE( AVERAGEX( VALUES(Dim_DateTable[Month Of Year]), [Sales Amount] ), period ) RETURN result
基于第二个度量值修改
Rolling 6M Sales Snapshot B = VAR numOfMonths = 6 VAR lastSalesDate = MAX(Fact_SalesInvoice[Value Date]) VAR rollingSum = CALCULATE( [Sales Amount], DATESINPERIOD(Dim_DateTable[dte], lastSalesDate, -numOfMonths, MONTH) ) RETURN rollingSum/numOfMonths
修改后,卡片会直接取销售数据的最后日期,计算该日期往前6个月的滚动平均值,得到快照值。
三、修复总计行显示的可选方案
如果需要表格总计行显示合理的滚动平均(比如最新日期的滚动平均),可以用ISINSCOPE函数判断是否在总计行,指定总计行的计算逻辑:
以第一个度量值为例:
Rolling 6M Sales Amount (Fixed Total) = VAR numOfMonths = 6 VAR lastSelectedDate = MAX(Dim_DateTable[dte]) VAR period = DATESINPERIOD(Dim_DateTable[dte], lastSelectedDate,-numOfMonths,MONTH) VAR result = CALCULATE( AVERAGEX( VALUES(Dim_DateTable[Month Of Year]), [Sales Amount] ), period ) VAR lastSalesDate = MAX(Fact_SalesInvoice[Value Date]) VAR firstVisibleDate = MAX(Dim_DateTable[dte]) -- 总计行时返回最新日期的滚动平均 VAR totalResult = CALCULATE( AVERAGEX( VALUES(Dim_DateTable[Month Of Year]), [Sales Amount] ), DATESINPERIOD(Dim_DateTable[dte], lastSalesDate,-numOfMonths,MONTH) ) RETURN IF( ISINSCOPE(Dim_DateTable[Month Of Year]), -- 判断是否在行级(非总计) IF(firstVisibleDate <= lastSalesDate, result), totalResult -- 总计行返回最新快照值 )
内容的提问来源于stack exchange,提问作者jansse

