Power BI中基于指定日期基线计算成本差值的DAX语法问题
Azure App Service成本节省DAX公式问题排查与修正
场景
Azure App Service云成本过高,2022年11月底实施了成本削减措施。2022年11月30日日成本为83.63,次日降至48.22。
目标
计算成本差值,凸显成本削减成效。
现有DAX公式(实际成本计算)
用于计算目标范围内App Service成本的DAX公式:
Savings App Service = CALCULATE( SUM('Usage details'[costInBillingCurrency]), FILTER ( 'Usage details', 'Usage details'[meterCategory] = "Azure App Service" && CONTAINSSTRING('Usage details'[meterName.1], "v2") && ( 'Usage details'[subscriptionName] = "devqa" || 'Usage details'[subscriptionName] = "presales" || 'Usage details'[subscriptionName] = "sandbox" ) ) )
问题:基线DAX公式语法错误
尝试基于2022年11月30日创建固定基线的公式出现语法错误,提示The Syntax for 'FILTER' is incorrect,错误公式如下:
Realised Testing = CALCULATE(sum('Usage details'[costInBillingCurrency]),FILTER(ALL('Usage details'[date].[Date]) = "30/11/2022") - SUM('Usage details'[costInBillingCurrency]) FILTER ( 'Usage details', 'Usage details'[meterCategory] = "Azure App Service" && CONTAINSSTRING('Usage details'[meterName.1], "v2") && ('Usage details'[subscriptionName] = "devqa" || 'Usage details'[subscriptionName] = "presales" || 'Usage details'[subscriptionName] = "sandbox") ))
错误原因
- FILTER语法误用:
FILTER(ALL('Usage details'[date].[Date]) = "30/11/2022")格式完全错误,FILTER需要表表达式+筛选条件两个参数,不能直接将ALL结果与日期比较。 - 括号不匹配:CALCULATE的参数未正确闭合,后续FILTER也未正确嵌套。
- 运算逻辑位置错误:成本差值的减法运算位置错误,应先分别计算基线值和实际值,再做减法。
修正方案
方案1:基于2022年11月30日创建固定基线
先计算11月30日的目标范围成本作为基线,再减去当前上下文的实际成本,得到节省金额:
Realised Savings (30 Nov Baseline) = VAR BaselineCost = CALCULATE( SUM('Usage details'[costInBillingCurrency]), 'Usage details'[date].[Date] = DATE(2022, 11, 30), 'Usage details'[meterCategory] = "Azure App Service", CONTAINSSTRING('Usage details'[meterName.1], "v2"), 'Usage details'[subscriptionName] IN {"devqa", "presales", "sandbox"} ) VAR CurrentCost = [Savings App Service] RETURN BaselineCost - CurrentCost
- 用
VAR拆分逻辑,提升可读性 - 直接用日期筛选替代错误的FILTER写法,用
IN简化订阅条件 - 复用已有
Savings App Service度量值获取当前实际成本
方案2:基于2022年11月平均日成本作为基线
若无法使用单日基线,可计算11月整月的平均日成本作为基准:
Realised Savings (Nov Avg Baseline) = VAR NovDailyCosts = CALCULATETABLE( ADDCOLUMNS( SUMMARIZE('Usage details', 'Usage details'[date].[Date]), "@DailyCost", [Savings App Service] ), MONTH('Usage details'[date].[Date]) = 11, YEAR('Usage details'[date].[Date]) = 2022 ) VAR NovAvgCost = AVERAGEX(NovDailyCosts, [@DailyCost]) VAR CurrentCost = [Savings App Service] RETURN NovAvgCost - CurrentCost
- 先计算11月每日的目标成本,再取平均值作为基线
- 复用已有度量值简化逻辑
补充问题:结果逐月递减不符合预期
使用修正后的公式后数值逐月递减,但实际2月节省成本应多于1月和12月,需排查以下可能:
- 日期上下文冲突:检查报表中的日期切片器或行/列上下文是否正确,确保
CurrentCost是对应月份的实际成本,而非累计值。 - 基线值被上下文修改:在基线计算的CALCULATE中添加
ALL('Usage details'[date])(若有独立日期表则用ALL('Date')),固定基线不受当前日期上下文干扰:VAR BaselineCost = CALCULATE( SUM('Usage details'[costInBillingCurrency]), 'Usage details'[date].[Date] = DATE(2022, 11, 30), 'Usage details'[meterCategory] = "Azure App Service", CONTAINSSTRING('Usage details'[meterName.1], "v2"), 'Usage details'[subscriptionName] IN {"devqa", "presales", "sandbox"}, ALL('Usage details'[date]) // 固定日期上下文,确保基线始终为11月30日的值 ) - 数据准确性问题:验证2月的实际成本数据是否正确,确认是否有未被过滤的额外App Service资源(如meterName不含v2的资源、其他订阅的成本混入)。
- 度量值逻辑冲突:检查是否有其他度量值或计算列影响
Savings App Service的结果,比如是否误使用了累计成本而非月度成本逻辑。
内容的提问来源于stack exchange,提问作者Francesco Mantovani
相关产品推荐
相关产品推荐

