DAX FILTER con múltiples criterios: AND, OR e IN en CALCULATE
Para filtrar con múltiples condiciones en DAX, tienes tres caminos: argumentos directos de CALCULATE (lo más eficiente), la función FILTER con operadores && / ||, o el operador IN con listas de valores. La elección depende de si filtras una columna, varias columnas, o necesitas una expresión que no sea una simple comparación.
¿Cuándo necesitas filtrar con múltiples criterios?
Cada vez que calculas una medida que debe responder a más de una condición simultáneamente. Ejemplos reales:
- Ventas solo de las categorías «CECO», «METALLIC» y «STEEL» (una columna, varios valores).
- Margen de productos activos vendidos en los últimos 90 días (dos columnas, condiciones distintas).
- Total de empleados excluyendo un departamento y filtrando por año fiscal (quitar un filtro y aplicar otro).
Este es uno de los escenarios más consultados por usuarios de Power BI: solo en el foro oficial de la comunidad Fabric, los hilos sobre FILTER con múltiples criterios acumulan más de 250,000 vistas.
Camino 1: argumentos directos de CALCULATE (sin FILTER)
La forma más limpia y eficiente cuando cada condición es una comparación simple sobre una columna:
Ventas Activos 2025 =
CALCULATE(
SUM( Ventas[Importe] ),
Productos[Estado] = "Activo",
Calendario[Año] = 2025
)
Cada argumento actúa como un filtro independiente. CALCULATE los combina con AND implícito: ambas condiciones deben cumplirse.
Ventajas: el motor de DAX optimiza estos filtros internamente. No necesitas FILTER para comparaciones de igualdad.
Limitación: no puedes usar >, <, <> ni expresiones complejas directamente como argumento. Para eso necesitas FILTER.
Camino 2: FILTER con AND (&&)
Cuando necesitas condiciones que no son simples igualdades, o cuando filtras la misma tabla con una expresión fila por fila:
Ventas Alto Valor Recientes =
CALCULATE(
SUM( Ventas[Importe] ),
FILTER(
Ventas,
Ventas[Importe] > 1000
&& Ventas[Fecha] >= DATE(2025, 1, 1)
)
)
El operador && equivale a AND: ambas condiciones deben ser verdaderas para cada fila.
Cuándo usar FILTER: cuando la condición involucra una comparación (>, <, >=, BETWEEN) o cuando necesitas evaluar una expresión fila por fila sobre la tabla de hechos.
Camino 3: FILTER con OR (||)
Para condiciones donde basta que una sea verdadera:
Ventas Extremos =
CALCULATE(
SUM( Ventas[Importe] ),
FILTER(
Ventas,
Ventas[Importe] > 10000
|| Ventas[Descuento] > 0.5
)
)
El operador || equivale a OR.
¿Cómo filtrar por una lista de valores? El operador IN
Uno de los patrones más buscados: filtrar una columna por varios valores específicos. El operador IN lo resuelve de forma limpia:
Costo Materiales =
CALCULATE(
SUM( Datos[Costo] ),
FILTER(
Datos,
Datos[Categoría] IN { "CECO", "METALLIC", "STEEL" }
)
)
La sintaxis { "valor1", "valor2", ... } define una tabla inline de valores. IN verifica si el valor de cada fila está en esa lista.
Alternativa sin FILTER (más eficiente cuando es una comparación simple):
Costo Materiales v2 =
CALCULATE(
SUM( Datos[Costo] ),
Datos[Categoría] IN { "CECO", "METALLIC", "STEEL" }
)
Cuando el operador IN es la única condición y se aplica sobre una columna de dimensión, puedes pasarlo directamente como argumento de CALCULATE sin envolverlo en FILTER.
¿Qué pasa si FILTER no parece funcionar? REMOVEFILTERS y ALL
Un problema frecuente: escribes un FILTER dentro de CALCULATE pero el resultado no cambia, o devuelve valores inesperados. La causa más común es que los filtros del reporte siguen activos y restringen tu resultado antes de que FILTER pueda actuar.
-- Problema: quieres datos de diciembre, pero el slicer está en enero
-- FILTER no "anula" el filtro del slicer
Headcount Diciembre =
CALCULATE(
[Headcount],
FILTER(
ALL( Calendario[Mes] ),
Calendario[Mes] = "Diciembre"
)
)
Aquí ALL( Calendario[Mes] ) primero elimina el filtro existente sobre la columna Mes, y luego FILTER aplica solo «Diciembre». Sin el ALL, el FILTER operaría sobre una tabla ya filtrada por el slicer (que dice «Enero»), y «Diciembre» no existiría en ese contexto.
REMOVEFILTERS es un alias más legible de ALL cuando se usa para este propósito:
Headcount Diciembre v2 =
CALCULATE(
[Headcount],
REMOVEFILTERS( Calendario[Mes] ),
Calendario[Mes] = "Diciembre"
)
KEEPFILTERS: preservar filtros existentes
Por defecto, los argumentos de CALCULATE reemplazan los filtros del contexto. Si quieres que tus filtros se intersecten con los existentes (en lugar de reemplazarlos), usa KEEPFILTERS:
Ventas Solo Activos =
CALCULATE(
SUM( Ventas[Importe] ),
KEEPFILTERS( Productos[Estado] = "Activo" )
)
Sin KEEPFILTERS, si un slicer tiene seleccionado «Inactivo», CALCULATE lo reemplaza por «Activo». Con KEEPFILTERS, ambos filtros se intersectan: si el slicer dice «Inactivo» y tú pides «Activo», el resultado es vacío (no hay intersección), que es el comportamiento correcto cuando quieres respetar las selecciones del usuario.
Tabla resumen: cuándo usar cada patrón
| Escenario | Patrón recomendado | Ejemplo |
|---|---|---|
| Igualdad simple, una columna | Argumento directo de CALCULATE | Productos[Estado] = "Activo" |
| Varios valores, una columna | IN { ... } como argumento |
Productos[Estado] IN { "A", "B" } |
| Comparaciones (>, <, >=) | FILTER( tabla, condición ) |
FILTER( Ventas, Ventas[Qty] > 100 ) |
| AND de dos columnas | Dos argumentos separados | Col1 = "X", Col2 = "Y" |
| OR entre columnas | FILTER con \|\| |
FILTER( T, T[A] > 10 \|\| T[B] < 5 ) |
| Ignorar filtro del slicer | ALL() o REMOVEFILTERS() |
REMOVEFILTERS( Calendario[Mes] ) |
| Preservar filtros del usuario | KEEPFILTERS() |
KEEPFILTERS( Prod[Estado] = "Activo" ) |
Errores comunes y cómo resolverlos
| Error / Síntoma | Causa | Solución |
|---|---|---|
| FILTER devuelve todo sin filtrar | La tabla base ya está filtrada por el contexto y excluye los valores que buscas | Usa ALL(columna) como primer argumento de FILTER |
| «A table of multiple values was supplied where a single value was expected» | Usas una columna con FILTER donde DAX espera un escalar | Envuelve la expresión en una medida o usa CALCULATE |
| REMOVEFILTERS no tiene efecto | Lo aplicas sobre una columna que no tiene filtro activo, o el filtro viene de una relación | Verifica con ISFILTERED() qué columna realmente filtra |
| El resultado no cambia al aplicar FILTER | CALCULATE reemplaza el filtro con los argumentos directos, pero el slicer vuelve a filtrarlo | Usa KEEPFILTERS si quieres intersección, o ALL si quieres ignorar el slicer |
Conclusión
El filtrado con múltiples criterios en DAX se reduce a elegir el patrón correcto:
- Comparaciones simples van como argumentos directos de CALCULATE (sin FILTER).
- Listas de valores usan el operador
IN { ... }. - Expresiones complejas (>, <, cálculos) requieren FILTER.
- Quitar filtros antes de aplicar otros usa ALL o REMOVEFILTERS.
- Preservar filtros existentes usa KEEPFILTERS.
Si quieres dominar estos patrones y muchos más con casos prácticos completos, el curso de Modelos de Datos y Análisis con DAX cubre cada uno en detalle.


Deja una respuesta