¿Qué hace CALCULATE (sin tecnicismos)?
CALCULATE es una función que calcula algo, pero cambiando los filtros que hay activos. Punto. Eso es todo.
Normalmente, en un visual, los filtros vienen del contexto (lo que ha seleccionado el usuario en los segmentadores). CALCULATE te permite ignorar esos filtros, añadir otros nuevos, o mezclar los dos. Es como decirle a Power BI: "Calcula esto, pero pretende que estos filtros existen".
CALCULATE(expresión, filtro1, filtro2, filtro3...) Eso es literalmente la estructura. Ahora veamos cómo funciona.
Paso 1: El caso más simple (CALCULATE con un filtro)
Imagina que tienes una tabla de ventas. Tu jefe te pide: "Quiero ver las ventas totales, pero también quiero ver cuáles fueron solo en el año 2023".
Sin CALCULATE, tendrías que crear otro gráfico o un segmentador. Con CALCULATE, haces esto:
Ventas 2023 =
CALCULATE(
SUM([Ventas]),
YEAR('Calendario'[Fecha]) = 2023
) Lo que dice: "Suma todas las ventas, pero solo cuenta las que ocurrieron en 2023, sin importar qué año haya seleccionado el usuario".
Si el usuario ha filtrado por 2024 en el segmentador, esta medida ignorará ese filtro y te dará 2023. Así es de potente.
Paso 2: Múltiples filtros (el caso realista)
Ahora tu jefe quiere más: "Ventas en 2023, solo para la región de Madrid, y solo productos de la categoría 'Electrónica'".
Tranquilo. Añades más filtros:
Ventas Electrónica Madrid 2023 =
CALCULATE(
SUM([Ventas]),
YEAR('Calendario'[Fecha]) = 2023,
'Geografía'[Región] = "Madrid",
'Productos'[Categoría] = "Electrónica"
) CALCULATE solo suma ventas que cumplan todos estos filtros a la vez. Si una venta no es de 2023, no entra. Si no es de Madrid, no entra. Si no es Electrónica, no entra.
Paso 3: Comparaciones (el truco del porcentaje)
Aquí es donde CALCULATE empieza a brillar de verdad. Quieres ver: "¿Cuál es el porcentaje de ventas de 2023 respecto al total de todos los años?"
Necesitas dos medidas:
Ventas 2023 =
CALCULATE(
SUM([Ventas]),
YEAR('Calendario'[Fecha]) = 2023
)
Porcentaje 2023 =
DIVIDE(
[Ventas 2023],
CALCULATE(SUM([Ventas]), ALL('Calendario'))
) * 100 ¿Ves qué pasó? La segunda medida usa CALCULATE para calcular el total sin aplicar ningún filtro de año. ALL('Calendario') es como decirle: "olvídate de cualquier filtro de fecha, suma TODO".
Resultado: tienes en una medida las ventas de 2023, y en otra el porcentaje que representan del total. Sin hacer nada en Excel.
Paso 4: El contexto de fila (cuando CALCULATE se vuelve mágico)
Hasta ahora hemos usado CALCULATE en medidas. Pero también funciona en columnas calculadas. La diferencia es que en una columna, CALCULATE conoce qué fila está evaluando.
Imagina una tabla con clientes y sus compras. Quieres una columna que diga: "¿Cuántas veces ha comprado este cliente en el último año?"
Compras Último Año =
CALCULATE(
COUNTA([ID Compra]),
'Calendario'[Año] = MAX('Calendario'[Año]),
RELATED('Clientes'[ID]) = [ClienteID]
) Power BI evaluará esta columna para cada fila. Cuando esté en la fila del cliente A, filtrará solo sus compras. Cuando esté en la del cliente B, filtrará solo las suyas. Así de inteligente.
Errores comunes que te rompen todo
- Olvidar los filtros: Si escribes
CALCULATE(SUM([Ventas]))sin filtros, estás sumando todo, siempre. CALCULATE sin filtros es inútil (casi). - Mezclar el contexto: Si usas una columna calculada con CALCULATE en un visual que ya está filtrado, ambos filtros se aplican. Esto a veces es lo que quieres, a veces no. Ten cuidado.
- Usar texto en lugar de columnas: Si escribes
CALCULATE(..., 'Tabla'[Columna] = "Texto")y esa columna tiene espacios raros o mayúsculas, no va a funcionar. Usa variables o asegúrate de que el texto es idéntico. - Olvidar que ALL elimina TODOS los filtros:
ALL('Tabla')limpia absolutamente todos los filtros de esa tabla. A veces solo quieres limpiar uno. UsaREMOVEFILTERS('Tabla'[Columna])en su lugar. - CALCULATE anidado innecesariamente: Si tienes
CALCULATE(CALCULATE(...), ...), algo está mal. Simplifica con variables.
Un ejemplo que realmente funciona en la oficina
Tú estás en tu escritorio y tu jefe dice: "Necesito ver las ventas por producto, pero quiero una columna extra que diga qué porcentaje es cada producto sobre el total de la tienda, y otra que diga qué porcentaje es sobre el total de su región".
Sin CALCULATE, esto sería pesadilla. Con CALCULATE:
Ventas = SUM([Ventas])
% del Total Tienda =
DIVIDE(
[Ventas],
CALCULATE([Ventas], ALL('Productos'), ALL('Geografía'))
)
% de su Región =
DIVIDE(
[Ventas],
CALCULATE([Ventas], ALL('Productos'))
) Primera medida: suma vendido por producto (normal).
Segunda medida: suma vendido por producto, pero divide por el total de TODOS los productos de TODAS las regiones.
Tercera medida: suma vendido por producto, pero divide por el total de todos los productos de esa región.
Tres medidas. Tres líneas de lógica. En Excel esto tomaría 30 minutos y terminarías con referencias raras. En DAX, son 30 segundos.
Pro Tip: Usa SELECTEDVALUE para valores dinámicos
SELECTEDVALUE
En lugar de escribir valores fijos como YEAR(...) = 2023, usa SELECTEDVALUE:
Ventas Año Seleccionado =
CALCULATE(
SUM([Ventas]),
YEAR('Calendario'[Fecha]) = SELECTEDVALUE('Parámetros'[Año])
) Así, si el usuario cambia el año en un segmentador, la medida se adapta automáticamente. Es como darle control total a tu usuario sin que tenga que tocar DAX. Resumiendo
CALCULATE es simplemente una función que permite recalcular algo bajo diferentes filtros. Eso es.
- Aprende la sintaxis básica:
CALCULATE(expresión, filtro1, filtro2) - Entiende que cada filtro es una condición que debe cumplirse (AND lógico).
- Usa
ALL()cuando quieras ignorar filtros completamente. - Combina CALCULATE con DIVIDE para porcentajes y proporciones.
- Practica con datos reales: año, región, categoría. Eso es todo.
Una vez que CALCULATE te entre en la cabeza, no vuelves atrás. Es como aprender el condicional en un idioma: de repente puedes decir cosas 10 veces más complejas y más precisas.