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:
- legibilidad,
- coherencia semántica,
- escalabilidad del modelo,
- alineación con reglas de negocio complejas.
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:
- Año: 2024
- Categoría: Electronics
- País: USA
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 set
{} actúa como un contenedor lógico de filtros
- Cada condición se evalúa en su tabla
- Las relaciones propagan el filtro hacia la tabla de hechos
👉 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:
- Margen del producto > 30%
- Región: Europa
- Año actual
DAX
High Margin Sales (Set) :=
CALCULATE(
SUM(FactSales[Amount]),
{
FILTER(
DimProduct,
DimProduct[Margin] > 0.3
),
DimCustomer[Region] = "Europe",
DimDate[Year] = YEAR(TODAY())
}
)
Explicación
FILTER() permite lógica por fila
- Los filtros simples siguen siendo expresivos
- Todo el contexto del cálculo está centralizado
👉 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
TREATAS crea relaciones virtuales
- El set
{} agrupa todas las reglas
- El modelo permanece desacoplado y flexible
👉 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:
- OrderDate (relación activa)
- ShipDate (relación inactiva)
Se requiere calcular ventas por ShipDate, además de:
- Categoría: Furniture
- Segmento: Corporate
DAX
Sales by Ship Date (Set) :=
CALCULATE(
SUM(FactSales[Amount]),
{
USERELATIONSHIP(
FactSales[ShipDate],
DimDate[Date]
),
DimProduct[Category] = "Furniture",
DimCustomer[Segment] = "Corporate"
}
)
Explicación
USERELATIONSHIP activa la relación correcta
- Los filtros de negocio permanecen explícitos
- El set
{} deja claro el “mundo” del cálculo
👉 Excelente para modelos con múltiples fechas.
Principios clave de la técnica `{}`
- El set
{} funciona como un AND lógico
- Cada filtro se evalúa en su propia tabla
- Mejora la legibilidad y mantenibilidad
- Ideal para documentar reglas de negocio
- Escala mejor que filtros dispersos
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.