CALCULATE en DAX: contexto y ejemplos

CALCULATE es la función central de DAX porque evalúa una expresión en un contexto de filtro modificado. No “suma” por sí misma: recibe una medida o expresión y cambia qué filas participan en su cálculo.
Sintaxis
CALCULATE(<expresión>, <filtro1>, <filtro2>, ...)
Partimos de una medida:
Ventas = SUM(Ventas[Importe])
Para calcular solo España:
Ventas España =
CALCULATE(
[Ventas],
Clientes[Pais] = "España"
)
En una matriz por año, CALCULATE conserva el filtro del año y añade —o reemplaza— el filtro de país. Entender esta intersección evita medidas que parecen correctas en una tarjeta pero fallan en el detalle.
Qué es el contexto de filtro
Cada visual, segmentador y eje crea filtros. Una celda con “2026” y “Tecnología” evalúa [Ventas] únicamente sobre esas filas. Las relaciones del modelo propagan filtros desde dimensiones hacia hechos.
CALCULATE modifica ese entorno temporalmente. No cambia los datos ni el filtro visible del informe.
Añadir varios filtros
Ventas Online España =
CALCULATE(
[Ventas],
Clientes[Pais] = "España",
Canal[Tipo] = "Online"
)
Los filtros separados se combinan con lógica AND. Para una condición OR en la misma columna:
Ventas Iberia =
CALCULATE(
[Ventas],
Clientes[Pais] IN {"España", "Portugal"}
)
Las expresiones booleanas sencillas son preferibles a envolver todo en FILTER. Resultan más claras y el motor puede optimizarlas mejor.
Reemplazar o conservar filtros
Por defecto, si la columna ya está filtrada, una nueva condición de CALCULATE la reemplaza. KEEPFILTERS pide la intersección:
Ventas Premium =
CALCULATE(
[Ventas],
KEEPFILTERS(Productos[Segmento] = "Premium")
)
Si el visual muestra solo “Estándar”, la intersección con “Premium” queda vacía en lugar de sustituir la selección.
Quitar filtros
Un porcentaje sobre el total:
% Ventas Categoría =
DIVIDE(
[Ventas],
CALCULATE(
[Ventas],
REMOVEFILTERS(Productos[Categoria])
)
)
El denominador elimina únicamente el filtro de categoría; conserva fecha, país y los demás filtros. REMOVEFILTERS(Productos) quitaría todos los filtros de esa tabla, una diferencia importante.
Evita ALL por costumbre cuando solo quieres retirar filtros. REMOVEFILTERS expresa mejor la intención en herramientas que la admiten.
FILTER para condiciones por fila
Usa FILTER cuando la condición necesita evaluar una tabla:
Ventas Productos Grandes =
CALCULATE(
[Ventas],
FILTER(
Productos,
Productos[Precio] > AVERAGE(Productos[Precio])
)
)
FILTER devuelve una tabla con las filas que cumplen. No filtres una tabla de hechos completa si una condición equivalente puede aplicarse a una dimensión más pequeña.
Transición de contexto
CALCULATE sin filtros convierte contexto de fila en contexto de filtro. Esto aparece dentro de columnas calculadas o iteradores. Cuando llamas a una medida dentro de un iterador, la transición suele aplicarse automáticamente.
La diferencia entre fila y filtro explica muchos resultados inesperados. Antes de añadir otra función, identifica:
- Qué filas está recorriendo la expresión.
- Qué filtros llegan desde el visual.
- Qué filtros añade, reemplaza o elimina CALCULATE.
Relaciones inactivas
USERELATIONSHIP activa una relación para el cálculo:
Ventas por Fecha Envío =
CALCULATE(
[Ventas],
USERELATIONSHIP(Ventas[FechaEnvio], Calendario[Fecha])
)
La medida utiliza fecha de envío mientras la relación activa general puede seguir usando fecha de pedido. Una tabla calendario coherente facilita este patrón.
Depuración
- Empieza con la medida base.
- Añade un filtro cada vez.
- Coloca columnas relevantes en una tabla visual.
- Comprueba totales y subtotales.
- Usa variables para nombrar valores intermedios.
- Evita filtros bidireccionales como parche.
CALCULATE no es difícil por su sintaxis, sino porque obliga a pensar en el modelo y en el contexto. Una medida profesional deja claro qué filtro cambia y por qué.
Continúa aprendiendo
Amplía este tema con nuestras guías sobre medidas y columnas calculadas.
Fuentes oficiales
Preguntas frecuentes
¿Qué hace CALCULATE en DAX?
Evalúa una expresión en un contexto de filtro modificado. Puede añadir, reemplazar o retirar filtros durante ese cálculo.
¿CALCULATE funciona solo en Power BI?
DAX y CALCULATE también se usan en Analysis Services y Power Pivot, con diferencias según la versión del motor.
¿Cuándo debo usar FILTER dentro de CALCULATE?
Cuando necesitas una expresión de tabla o una condición que no cabe en un filtro booleano sencillo. Evítalo si una condición directa expresa lo mismo.
¿Qué diferencia hay entre ALL y REMOVEFILTERS?
Ambas pueden retirar filtros; REMOVEFILTERS expresa esa intención directamente, mientras ALL también puede devolver una tabla.
¿Qué hace KEEPFILTERS?
Hace que el nuevo filtro se cruce con el existente en vez de reemplazarlo en las mismas columnas.
¿Por qué el total no coincide con la suma de filas?
DAX recalcula la medida en el contexto del total. No suma necesariamente los resultados visibles de cada fila.

Deja una respuesta