The ultimate Fabric, Power BI, SQL, and AI community-led learning event. Save €200 with code FABCOMM.
Get registeredEnhance your career with this limited time 50% discount on Fabric and Power BI exams. Ends August 31st. Request your voucher.
Estoy seguro de que hay una explicación muy sencilla para esto. Simplemente no puedo entenderlo.
Esta es mi tabla de recursos:
Recurso |
ResourceID (Id. de recurso) |
Nombre |
Grupo de recursos |
Capacidad |
Quiero sumar la capacidad del recurso visible, pero excluir a cualquiera con determinados valores de grupo de recursos. Así que probé esto:
Este es el resultado de eso (la tabla incluye la Suma de Capacidad sin modificar, pero la Tarjeta total tiene "Capacidad sin Administración":
Solo se muestran 64 filas, pero mi cálculo en la tarjeta parece tener un piso de 770 (el total sin segmentaciones aplicadas es de 774).
Así que probé SUMX:
Ahora obtengo el resultado que esperaba:
Pero no entiendo por qué. ¿Por qué CALCULATE SUM parece incluir filas que no están en la tabla, aunque tienen los mismos filtros?
Hola @jsangerman ,
La diferencia entre los dos enfoques de DAX se reduce a cómo CALCULATE y SUMX controlan el contexto de filtro. Cuando se utiliza CALCULATE con varios argumentos de filtro como Resource[Resource Group] <> "Management", <> "Leadership" y <> "Executive Assistance", cada condición se evalúa por separado, no como un conjunto combinado. Eso significa que las filas que no cumplen una condición aún pueden pasar otra, por lo que muchas filas no deseadas permanecen en el resultado. Esto crea un comportamiento lógico OR en lugar del AND que esperaba. Como resultado, CALCULATE incluye filas que no debería, lo que da lugar a una mayor capacidad total incluso cuando los filtros parecen correctos.
Por el contrario, SUMX funciona según lo esperado porque envuelve la lógica dentro de una función FILTER, que aplica la evaluación fila por fila y aplica todas las condiciones de filtro juntas. De este modo, se crea de forma eficaz la lógica AND prevista y se garantiza que solo se tengan en cuenta las filas correctas.
Esta es la versión que usa SUMX y FILTER, que devuelve el resultado correcto:
Capacity without Managers =
VAR _Capacity =
SUMX(
FILTER(
Resource,
Resource[Resource Group] <> "Management" &&
Resource[Resource Group] <> "Leadership" &&
Resource[Resource Group] <> "Executive Assistance"
),
Resource[Capacity]
)
VAR _Result = IF(_Capacity <> BLANK(), _Capacity, 0)
RETURN _Result
Si prefiere usar CALCULATE, debe encapsular la lógica de filtro dentro de una sola expresión FILTER(...) para evitar la desconexión lógica:
Capacity without Managers =
VAR _Capacity =
CALCULATE(
SUM(Resource[Capacity]),
FILTER(
Resource,
Resource[Resource Group] <> "Management" &&
Resource[Resource Group] <> "Leadership" &&
Resource[Resource Group] <> "Executive Assistance"
)
)
VAR _Result = IF(_Capacity <> BLANK(), _Capacity, 0)
RETURN _Result
Sin envolver en FILTER, CALCULATE aplica filtros de forma independiente y pierde el efecto combinado, por lo que el número que vio era incorrecto. Esta es una trampa clásica del DAX en la que el diablo está en el contexto.
Saludos
Esa es una cosa increíblemente básica que debería entender completamente en este punto. Gracias por la ayuda.