CALCULATE EN POWER BI: LA FUNCIÓN MÁS IMPORTANTE DE DAX

"CALCULATE" evalúa una expresión, normalmente una medida o un cálculo, en un contexto de filtro modificado. En otras palabras: toma el contexto de filtro actua,l lo que el usuario ha filtrado en el informe: año, región, producto, etc. y lo cambia según las condiciones que se le indiquen.

Sintaxis básica

CALCULATE(
    expresión,
    filtro1,
    filtro2,
    ...
)
  • Expresión: casi siempre una medida o una agregación, como "SUM", "AVERAGE", "COUNTROWS", etc..
  • Filtros: condiciones que modifican el contexto. Pueden ser:
    • Columnas con valores concretos
    • Tablas filtradas
    • Funciones de filtro, como "ALL", "FILTER", " ALLEXCEPT", "REMOVEFILTERS", "KEEPFILTERS", etc.

Por qué es tan importante

Sin "CALCULATE", las medidas en Power BI solo respetan los filtros que el usuario aplica en el informe. Con "CALCULATE" se puede:
  • Calcular el total del año anterior
  • Comparar un producto contra el resto
  • Ignorar ciertos filtros
  • Crear porcentajes sobre el total
  • Hacer cálculos "YTD", "MTD", "QTD"
  • Implementar lógica de negocio compleja
  • Prácticamente todas las medidas “inteligentes” usan "CALCULATE".

Ejemplos prácticos

Ventas del año anterior

Ventas Año Anterior = CALCULATE( [Ventas Totales], SAMEPERIODLASTYEAR('Calendario'[Fecha]) )

Porcentaje sobre el total

% del Total = DIVIDE( [Ventas Totales], CALCULATE( [Ventas Totales], ALL('Productos') ) )
"ALL('Productos')" elimina el filtro de la tabla "Productos", de modo que el denominador es siempre el total general.

Ventas solo de un producto específico (ignorando el filtro del usuario)

Ventas de Producto X = CALCULATE( [Ventas Totales], 'Productos'[Nombre Producto] = "Producto X" )

Ventas de todas las categorías excepto la seleccionadadax

Ventas Otras Categorías = CALCULATE( [Ventas Totales], ALL('Productos'[Categoría]) ) - [Ventas Totales]

Usando FILTER (cuando se necesita una condición más compleja)

Ventas > 1000 = CALCULATE( [Ventas Totales], FILTER( 'Ventas', 'Ventas'[Importe] > 1000 ) )
Nota importante: Evitar "FILTER", siempre que se pueda, sobre tablas grandes. Es mejor filtros simples de columna porque son más eficientes.

Cómo funciona el contexto de filtro

"CALCULATE" tiene dos efectos principales:
  • Modifica el contexto de filtro existente.
  • Convierte el contexto de fila en contexto de filtro, esto es lo que permite que las medidas funcionen dentro de tablas calculadas o columnas calculadas.
Cuando se usan varios filtros dentro de "CALCULATE", se combinan con lógica "AND". Si se quiere usar lógica "OR", normalmente usar "FILTER" o tablas virtuales.

Funciones usadas frecuentemente con CALCULATE

Función Qué hace Uso típico
"ALL" / "REMOVEFILTERS" Elimina filtros Totales y porcentajes
"ALLEXCEPT" Elimina todos los filtros excepto algunos Totales por grupo
"ALLSELECTED" Respeta los filtros del informe pero no los de la visual Totales dinámicos
"FILTER" Aplica un filtro complejo Condiciones personalizadas
"KEEPFILTERS" Mantiene los filtros existentes Evitar que se sobreescriban
"VALUES" / "DISTINCT" Obtiene valores únicos Filtros dinámicos
"SAMEPERIODLASTYEAR", "DATEADD", "DATESYTD"... Inteligencia de tiempo Comparaciones temporales

Errores comunes y buenas prácticas

  • No usar "CALCULATE" innecesariamente: Si solo se quiere "SUM(Ventas[Importe])", no hace falta envolverlo en "CALCULATE".
  • Tener cuidado con el orden de los filtros: Los filtros se evalúan de izquierda a derecha y se van acumulando..
  • Es mejor medidas a columnas calculadas: Las medidas con "CALCULATE" son mucho más flexibles y eficientes..
  • Nombrar bien las medidas: Usar nombres claros como "Ventas YTD", "% Margen", "Clientes Activos", etc..
  • Probar siempre el contexto: Usar la vista de datos o crea tablas de prueba para verificar qué filtros se están aplicando realmente.