En Power BI, la consistencia es la capacidad del modelo de datos para mantener coherencia semántica, estructural y lógica en todas sus capas:
Un modelo es consistente cuando la misma pregunta produce la misma respuesta, independientemente del visual, el contexto de filtro o el nivel de agregación.
Un KPI como Total Ventas debe mostrar el mismo valor:
Si un visual muestra: 1,250,000
y otro muestra: 1,180,000
bajo los mismos filtros, existe una inconsistencia contextual o semántica.
1. Medida correctamente definida (robusta frente al contexto):
Total Ventas = SUMX('Ventas', 'Ventas'[Monto])
2. Validación de consistencia usando una Truth Row:
EVALUATE
ROW(
"Valor_Card", [Total Ventas],
"Valor_Table", CALCULATE([Total Ventas], ALL('Ventas')),
"Valor_Filtered", CALCULATE([Total Ventas], KEEPFILTERS('Productos'))
)
Interpretación del sample:
Si Valor_Card = Valor_Table bajo el mismo filtro → consistente
Si alguno difiere sin causa de negocio → inconsistencia detectada
La consistencia en Power BI surge de la necesidad del motor tabular (VertiPaq + DAX engine) de mantener una representación estable, unificada y no contradictoria del negocio.
Esta propiedad garantiza que:
La consistencia tiene una naturaleza ontológica dentro del BI:
es la fuerza que mantiene la integridad del “mundo” que el modelo representa.
Sin ella, el sistema se fragmenta en versiones contradictorias de la verdad.
Un cliente debe ser interpretado de la misma manera por todas las fuentes.
Caso inconsistente:
CustomerID = 123Customer_ID = "CUS123"IdCliente = "00123"Power BI interpreta tres identidades distintas:
Resultado:
La “identidad” del cliente no es estable → inconsistencia semántica.
1) Normalizar todos los CustomerID a un formato uniforme:
CustomerID_Normalized =
Text.PadStart(
Text.Select([CustomerID], {"0".."9"}),
6,
"0"
)
2) Resultado:
Ventas → 123 → 000123
CRM → CUS123 → 000123
Soporte → 00123 → 000123
3) Impacto:
- El motor tabular reconoce una sola entidad
- Relaciones estables
- Cálculos DAX correctos
Transformaciones estables y deterministas.
Fechas con distintos formatos entre tablas.
Fecha = Date.FromText([FechaRaw])
Las relaciones deben reflejar la lógica del negocio.
OrderID duplicado genera totales inflados.
Duplicados = Table.DuplicateRows(Ventas, {"OrderID"})
Las medidas deben comportarse igual bajo cualquier contexto.
La medida funciona en un Card pero falla en Matrix.
EVALUATE
SUMMARIZE(
'Ventas',
"Card", [Total Ventas],
"All", CALCULATE([Total Ventas], ALL('Ventas')),
"RowContext", SUM('Ventas'[Monto])
)
CALCULATE([Total Ventas], ALLSELECTED())
Budget Diario =
DIVIDE(
[Budget Mensual],
COUNTROWS(VALUES('Calendario'[Fecha]))
)
Ventas YTD =
CALCULATE([Total Ventas], DATESYTD('Calendario'[Fecha]))
Group = Table.Group(DimCustomer, {"CustomerID"}, {{"Count", each Table.RowCount(_), Int64.Type}})
MissingProducts = EXCEPT( VALUES(FactSales[ProductID]), VALUES(DimProduct[ProductID]) )
MinFecha = MIN('Ventas'[Fecha])
MaxFecha = MAX('FechaCalendario'[Fecha])
#"Renamed Columns" = Table.RenameColumns(Source, {{"Fecha", "TransactionDate"}})
EVALUATE ROW(
"Card", [Total Ventas],
"Table", CALCULATE([Total Ventas], ALL('Ventas')),
"Filtered", CALCULATE([Total Ventas], KEEPFILTERS('Productos'))
)
Model.Relationships | summarize Count=count() by FromTable, ToTable
CALCULATE([KPI], REMOVEFILTERS())
| Entidad | KPI | Definición | Fórmula | | Ventas | Total Ventas | Monto facturado | SUMX(Ventas, Monto) | | Finanzas| Total Ventas | Ingresos netos | SUMX(Ventas, Monto - Impuestos) |
EVALUATE
ADDCOLUMNS(
VALUES('Productos'[Categoria]),
"Esperado", [Total Ventas Esperado],
"Obtenido", [Total Ventas],
"Consistente", IF([Total Ventas Esperado] = [Total Ventas], TRUE(), FALSE())
)
Budget Diario =
DIVIDE(
SUM(Budget[Monto]),
COUNTROWS(VALUES('Calendario'[Fecha]))
)