Saltar al contenido

DAX FILTER con múltiples criterios: AND, OR e IN en CALCULATE

Función FILTER de DAX con múltiples criterios en Power BI

Escrito por

en

,

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:

  1. Comparaciones simples van como argumentos directos de CALCULATE (sin FILTER).
  2. Listas de valores usan el operador IN { ... }.
  3. Expresiones complejas (>, <, cálculos) requieren FILTER.
  4. Quitar filtros antes de aplicar otros usa ALL o REMOVEFILTERS.
  5. 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.

Power BI: Modelos de Datos y Análisis con DAXTOP VENTASUdemy
Power Bi – DAX

Power BI: Modelos de Datos y Análisis con DAX

★ 4.7(1000 estudiantes)
$34.99

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *