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())
核心原因
- SELECTEDVALUE的局限性:小计层级下
Analitica[Nivel1]包含多个值,SELECTEDVALUE返回BLANK,导致Neto Analitica Unitario的IF逻辑进入SUMX分支,但Neto Analitica Unitario Prev.因无匹配SWITCH分支也返回BLANK,最终小计行无结果。 - 提前ROUND导致精度丢失:单个值计算时就对每一步结果ROUND,会导致小计汇总结果与实际计算不符,甚至因精度问题返回BLANK。
- 上下文判断条件过严:
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
相关产品推荐
相关产品推荐

