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

Power BI中使用Switch函数计算时无法显示小计的问题排查

解决DAX度量值小计不显示的问题

问题背景

创建了一个使用SWITCH返回不同结果的DAX度量值,单独筛选Analitica[Nivel1]中的某个值时能正常得到结果,但无法显示层级“I”的小计。相关度量值代码如下:

上层度量值

Neto Analitica Unitario = IF(OR(SELECTEDVALUE(Analitica[Nivel1]) = "COSTE INDIRECTO CAMPO", SELECTEDVALUE(Analitica[Nivel1]) = "COSTE INDIRECTO SALIDAS"), CALCULATE([Neto Analitica Unitario Prev.]),SUMX(values(Articulo[FamiliaSuperior]), [Neto Analitica Unitario Prev.]))

依赖的SWITCH度量值

Neto Analitica Unitario Prev. = VAR _Calculo = SWITCH (
SELECTEDVALUE ( Analitica[Nivel1] ),
"VENTAS", DIVIDE([Total Venta Analitico], [Peso Neto Salidas]),
"COSTE DIRECTO ENTRADAS", [Coste Unitario Directo Entradas Año Natural],
"COSTE DIRECTO SALIDAS", DIVIDE( [Coste Directo Salida], [Peso Neto Salidas]),
"MARGEN BRUTO",
    ROUND(DIVIDE([Total Venta Analitico], [Peso Neto Salidas]),2)
        - ROUND([Coste Unitario Directo Entradas Año Natural],2) 
            - ROUND(DIVIDE( [Coste Directo Salida], [Peso Neto Salidas]),2),
"COSTE INDIRECTO SALIDAS", DIVIDE([Coste Indirecto Salidas] * ( -1 ), [Peso Neto Salidas]),
"COSTE INDIRECTO CAMPO", DIVIDE([Coste Indirecto Campo], [Peso Neto Salidas Proveedor Interno]) * (-1),
"COSTE DIRECTO CAMPO",[Coste Unitario Directo Campo Prev.],
"MARGEN NETO",
   ROUND(CALCULATE(ROUND(DIVIDE( [Total Venta Analitico], [Peso Neto Salidas]),2)
    - ROUND([Coste Unitario Directo Entradas Año Natural],2)
        - ROUND(DIVIDE( [Coste Directo Salida], [Peso Neto Salidas]),2)
             - ROUND(DIVIDE([Coste Indirecto Salidas] * ( -1 ), [Peso Neto Salidas]),2)
                + ROUND(DIVIDE([Coste Indirecto Campo], [Peso Neto Salidas Proveedor Interno]),2)
                    -  ROUND([Coste Unitario Directo Campo Prev.],2)),2))
        RETURN IF([Peso Neto Salidas] <> BLANK(), _Calculo, BLANK())

核心原因

  1. SELECTEDVALUE的局限性:小计层级下Analitica[Nivel1]包含多个值,SELECTEDVALUE返回BLANK,导致Neto Analitica Unitario的IF逻辑进入SUMX分支,但Neto Analitica Unitario Prev.因无匹配SWITCH分支也返回BLANK,最终小计行无结果。
  2. 提前ROUND导致精度丢失:单个值计算时就对每一步结果ROUND,会导致小计汇总结果与实际计算不符,甚至因精度问题返回BLANK。
  3. 上下文判断条件过严:IF([Peso Neto Salidas] <> BLANK(), _Calculo, BLANK())在小计行可能不满足,因为小计行的[Peso Neto Salidas]可能不符合单个值的判断逻辑。

解决方案

1. 兼容多值上下文的判断逻辑

用HASONEVALUE先判断是否为单个Nivel1值,再执行对应分支;小计场景下遍历每个Nivel1值计算后汇总,避免SWITCH分支失效。

2. 调整ROUND位置

不在每一步计算中ROUND,完成所有逻辑后统一对最终结果ROUND,避免精度丢失。

3. 放宽上下文判断

确保多值上下文下每个Nivel1的计算都能执行,再汇总结果。

修改后的度量值代码

修正Neto Analitica Unitario Prev.

Neto Analitica Unitario Prev. = 
VAR _Calculo = 
    SWITCH (
        TRUE(),
        // 单个Nivel1值的场景
        HASONEVALUE(Analitica[Nivel1]),
            SWITCH(SELECTEDVALUE(Analitica[Nivel1]),
                "VENTAS", DIVIDE([Total Venta Analitico], [Peso Neto Salidas]),
                "COSTE DIRECTO ENTRADAS", [Coste Unitario Directo Entradas Año Natural],
                "COSTE DIRECTO SALIDAS", DIVIDE( [Coste Directo Salida], [Peso Neto Salidas]),
                "MARGEN BRUTO",
                    DIVIDE([Total Venta Analitico], [Peso Neto Salidas])
                        - [Coste Unitario Directo Entradas Año Natural] 
                        - DIVIDE( [Coste Directo Salida], [Peso Neto Salidas]),
                "COSTE INDIRECTO SALIDAS", DIVIDE([Coste Indirecto Salidas] * ( -1 ), [Peso Neto Salidas]),
                "COSTE INDIRECTO CAMPO", DIVIDE([Coste Indirecto Campo], [Peso Neto Salidas Proveedor Interno]) * (-1),
                "COSTE DIRECTO CAMPO", [Coste Unitario Directo Campo Prev.],
                "MARGEN NETO",
                    DIVIDE( [Total Venta Analitico], [Peso Neto Salidas])
                        - [Coste Unitario Directo Entradas Año Natural]
                        - DIVIDE( [Coste Directo Salida], [Peso Neto Salidas])
                        - DIVIDE([Coste Indirecto Salidas] * ( -1 ), [Peso Neto Salidas])
                        + DIVIDE([Coste Indirecto Campo], [Peso Neto Salidas Proveedor Interno])
                        - [Coste Unitario Directo Campo Prev.]
            ),
        // 小计(多值)场景:遍历每个Nivel1计算后汇总
        SUMX(VALUES(Analitica[Nivel1]), [Neto Analitica Unitario Prev.])
    )
// 最后统一ROUND,避免精度丢失,同时允许小计行有结果
RETURN IF(NOT ISBLANK(_Calculo), ROUND(_Calculo, 2), BLANK())

调整Neto Analitica Unitario

Neto Analitica Unitario = 
VAR CurrentNivel1 = SELECTEDVALUE(Analitica[Nivel1])
RETURN
    IF(
        OR(CurrentNivel1 = "COSTE INDIRECTO CAMPO", CurrentNivel1 = "COSTE INDIRECTO SALIDAS"),
        [Neto Analitica Unitario Prev.],
        SUMX(VALUES(Articulo[FamiliaSuperior]), [Neto Analitica Unitario Prev.])
    )

关于表关系的疑问

表关系可能影响度量值的上下文筛选,但当前问题核心是DAX度量值的上下文判断和计算逻辑错误。如果修改后仍无小计,可检查:

  • Analitica表与Articulo等表的关系是否为双向筛选,或筛选方向是否正确
  • 小计层级的上下文是否包含所有必要筛选条件,确保底层度量值能正确获取数值

内容的提问来源于stack exchange,提问作者Luis Miguel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:15:22