You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")
 ))

错误原因

  1. FILTER语法误用:FILTER(ALL('Usage details'[date].[Date]) = "30/11/2022")格式完全错误,FILTER需要表表达式+筛选条件两个参数,不能直接将ALL结果与日期比较。
  2. 括号不匹配:CALCULATE的参数未正确闭合,后续FILTER也未正确嵌套。
  3. 运算逻辑位置错误:成本差值的减法运算位置错误,应先分别计算基线值和实际值,再做减法。

修正方案

方案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月,需排查以下可能:

  1. 日期上下文冲突:检查报表中的日期切片器或行/列上下文是否正确,确保CurrentCost是对应月份的实际成本,而非累计值。
  2. 基线值被上下文修改:在基线计算的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日的值
        )
    
  3. 数据准确性问题:验证2月的实际成本数据是否正确,确认是否有未被过滤的额外App Service资源(如meterName不含v2的资源、其他订阅的成本混入)。
  4. 度量值逻辑冲突:检查是否有其他度量值或计算列影响Savings App Service的结果,比如是否误使用了累计成本而非月度成本逻辑。

内容的提问来源于stack exchange,提问作者Francesco Mantovani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:15:39