FUNCIONES DE FILTRO Y CONTEXTO DE POWER BI

En Power BI, el lenguaje DAX, acrónimo de Data Analysis Expressions, no funciona como las fórmulas tradicionales de Excel. Cada cálculo se evalúa dentro de un contexto de evaluación. Comprender este concepto, especialmente el contexto de filtro y el contexto de fila, junto con las funciones que lo manipulan, es la clave para crear medidas potentes, dinámicas y correctas.

¿Qué es el contexto en DAX?

El contexto de evaluación determina qué datos “ve” una fórmula en el momento de ejecutarse. Hay dos tipos principales:

Contexto de filtro (Filter Context)

Es el conjunto de filtros activos que limitan las filas del modelo de datos sobre las que se realiza un cálculo.
Se genera a partir de:
  • Segmentadores
  • Filtros del panel de filtros, como nivel visual, página o informe
  • Campos en filas, columnas, ejes o leyendas de un visual
  • Interacciones entre visuales, cross-filtering
  • Funciones DAX como "CALCULATE"

Ejemplo simple

La medida "Total Ventas = SUM(Ventas[Importe])" mostrará un valor diferente según el país, año o producto seleccionado en el informe, porque el contexto de filtro cambia.

Contexto de fila

Se produce cuando DAX evalúa una expresión fila por fila. Aparece en:
  • Columnas calculadas
  • Funciones iteradoras, como "SUMX", "AVERAGEX", "FILTER", "ADDCOLUMNS", etc.
En este contexto, DAX “sabe” en qué fila está y puede acceder a los valores de las columnas de esa fila.

Transición de contexto

Es el mecanismo más importante de DAX. Ocurre cuando se usa "CALCULATE", o se referencia una medida, dentro de un contexto de fila. Convierte automáticamente los valores de la fila actual en filtros del contexto de filtro.

La función estrella: CALCULATE

"CALCULATE" es la función más importante de DAX. Su trabajo principal es modificar el contexto de filtro antes de evaluar una expresión.

Sintaxis

CALCULATE(
,
,
,
...
)

Ejemplos prácticos

// Ventas solo de España (reemplazar cualquier filtro de país)
Ventas España = 
CALCULATE(
[Total Ventas],
Clientes[País] = "España"
)

// Porcentaje sobre el total (elimina filtros de producto)
% del Total = 
DIVIDE(
[Total Ventas],
CALCULATE(
[Total Ventas],
ALL(Productos)
)
)

Principales funciones de filtro

Estas funciones se usan casi siempre dentro de "CALCULATE" o como argumentos de tabla:

Función Qué hace Ejemplo de uso típico
FILTER Devuelve una tabla filtrada según una condición (crea contexto de fila) Filtrar productos con ventas > 1000
ALL Elimina todos los filtros de una tabla o columna Calcular totales generales
ALLEXCEPT Elimina todos los filtros excepto los de las columnas indicadas Totales por categoría manteniendo el producto
ALLSELECTED Elimina filtros externos, pero respeta los de la selección actual del visual Porcentajes respetando segmentadores
REMOVEFILTERS Similar a ALL (más legible en versiones recientes) Quitar filtros específicos
KEEPFILTERS Conserva los filtros existentes en lugar de sobrescribirlos Evitar que un filtro reemplace otro
VALUES / DISTINCT Devuelve valores únicos de una columna en el contexto actual Iterar solo valores visibles
RELATED / RELATEDTABLE Accede a tablas relacionadas desde contexto de fila Traer datos de tablas dimension

Ejemplo


// Usando FILTER
Ventas Productos Caros = 
CALCULATE(
[Total Ventas],
FILTER(
Productos,
Productos[Precio] > 100
)
)

// ALLEXCEPT
Ventas Total Categoría = 
CALCULATE(
[Total Ventas],
ALLEXCEPT(Productos, Productos[Categoría])
)

// KEEPFILTERS (recomendado en muchos casos modernos)
Ventas Rojas = 
CALCULATE(
[Total Ventas],
KEEPFILTERS(Productos[Color] = "Rojo")
)

Diferencias importantes y buenas prácticas

  • "FILTER" vs predicados simples: "CALCULATE([Total], Productos[Color] = "Rojo")" es más eficiente que usar "FILTER" cuando es posible.DAX convierte internamente el predicado en un FILTER optimizado.
  • Orden de evaluación: Primero se aplica el contexto de filtro → luego, si hay iteradores, el contexto de fila → y "CALCULATE" puede transformar uno en el otro.
  • Evitar usar "FILTER" innecesariamente dentro de "CALCULATE" cuando un simple filtro de columna es suficiente (mejor rendimiento).
  • "ALLSELECTED" es especialmente útil en informes interactivos donde se quieren porcentajes que respeten la selección del usuario, pero ignoren filtros de otros visuales.

Ejemplo completo de medida avanzada

% Ventas sobre Total Visible = 
VAR VentasActuales = [Total Ventas]
VAR TotalVisible = 
CALCULATE(
[Total Ventas],
ALLSELECTED(Productos)// Respeta la selección del usuario
)
RETURN
DIVIDE(VentasActuales, TotalVisible)