CALCULATE con Sets de Filtros `{}` en DAX

Una forma clara, escalable y semántica de definir reglas de negocio en Power BI

Introducción

En Power BI, DAX no es solo un lenguaje de cálculo, es un lenguaje semántico. Dentro de DAX, CALCULATE es la función más poderosa porque permite redefinir el contexto bajo el cual una medida se evalúa.

Una técnica avanzada, limpia y altamente mantenible consiste en agrupar múltiples filtros dentro de un set {}, tratándolos como una tabla virtual de reglas.

Este enfoque mejora:

En este artículo exploramos 4 escenarios reales usando esta técnica.

1️⃣ Filtros simples en múltiples tablas (caso clásico)

Escenario

Calcular las ventas totales:

Cada filtro vive en una tabla distinta del modelo.

DAX

Total Sales (Set Filters) := CALCULATE( SUM(FactSales[Amount]), { DimDate[Year] = 2024, DimProduct[Category] = "Electronics", DimCustomer[Country] = "USA" } )

Explicación

👉 El resultado es el mismo que con filtros tradicionales, pero más claro y más declarativo.

2️⃣ Mezcla de filtros simples y lógica compleja

Escenario

Ventas que cumplan:

DAX

High Margin Sales (Set) := CALCULATE( SUM(FactSales[Amount]), { FILTER( DimProduct, DimProduct[Margin] > 0.3 ), DimCustomer[Region] = "Europe", DimDate[Year] = YEAR(TODAY()) } )

Explicación

👉 Ideal para reglas de negocio mixtas (condicionales + atributos).

3️⃣ Filtros sin relaciones físicas (TREATAS + set)

Escenario

El modelo usa tablas desconectadas para slicers:

No existen relaciones físicas con las dimensiones.

DAX

Sales Virtual Filters := CALCULATE( SUM(FactSales[Amount]), { TREATAS( VALUES(DisconnectedCountry[Country]), DimCustomer[Country] ), TREATAS( VALUES(DisconnectedCategory[Category]), DimProduct[Category] ), TREATAS( VALUES(DisconnectedYear[Year]), DimDate[Year] ) } )

Explicación

👉 Técnica clave para UX avanzada, slicers personalizados y escenarios dinámicos.

4️⃣ Activar relaciones alternativas (USERELATIONSHIP)

Escenario

La tabla de hechos tiene dos fechas:

Se requiere calcular ventas por ShipDate, además de:

DAX

Sales by Ship Date (Set) := CALCULATE( SUM(FactSales[Amount]), { USERELATIONSHIP( FactSales[ShipDate], DimDate[Date] ), DimProduct[Category] = "Furniture", DimCustomer[Segment] = "Corporate" } )

Explicación

👉 Excelente para modelos con múltiples fechas.

Principios clave de la técnica `{}`

Conclusión

CALCULATE redefine el contexto.
El set {} define las reglas de ese contexto.

Usar {} no es solo una elección sintáctica, es una decisión de diseño semántico. Cuando los modelos crecen, esta técnica se convierte en una ventaja estructural clara.