Consistency — Estabilidad Semántica en el Motor Tabular

1. Definición — Qué significa CONSISTENCY en Power BI

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.

Ejemplo (EXPLANATORY EXAMPLE)

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.

Sample (IMPLEMENTATION SAMPLE)

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

2. Naturaleza — Por qué la CONSISTENCY es esencial en Power BI

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.

Ejemplo (EXPLANATORY EXAMPLE)

Un cliente debe ser interpretado de la misma manera por todas las fuentes.

Caso inconsistente:

Power BI interpreta tres identidades distintas:

Resultado:
La “identidad” del cliente no es estable → inconsistencia semántica.

Sample (IMPLEMENTATION SAMPLE)

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

3. Función — Cómo opera CONSISTENCY en el pipeline Power BI

A) Consistencia estructural (Power Query)

Transformaciones estables y deterministas.

Ejemplo

Fechas con distintos formatos entre tablas.

Sample

Fecha = Date.FromText([FechaRaw])

B) Consistencia relacional (Modelo Tabular)

Las relaciones deben reflejar la lógica del negocio.

Ejemplo

OrderID duplicado genera totales inflados.

Sample

Duplicados = Table.DuplicateRows(Ventas, {"OrderID"})

C) Consistencia calculada (DAX)

Las medidas deben comportarse igual bajo cualquier contexto.

Ejemplo

La medida funciona en un Card pero falla en Matrix.

Sample

EVALUATE
SUMMARIZE(
  'Ventas',
  "Card", [Total Ventas],
  "All", CALCULATE([Total Ventas], ALL('Ventas')),
  "RowContext", SUM('Ventas'[Monto])
)

4. Consecuencias — Qué ocurre cuando la consistencia falla

A) KPIs diferentes según visual

CALCULATE([Total Ventas], ALLSELECTED())

B) Conflictos de granularidad

Budget Diario = 
DIVIDE(
   [Budget Mensual],
   COUNTROWS(VALUES('Calendario'[Fecha]))
)

C) Medidas que fallan según jerarquía

Ventas YTD =
CALCULATE([Total Ventas], DATESYTD('Calendario'[Fecha]))

D) Duplicados que rompen claves

Group = Table.Group(DimCustomer, {"CustomerID"}, {{"Count", each Table.RowCount(_), Int64.Type}})

5. Interacciones — Propiedades relacionadas

Integrity

MissingProducts =
EXCEPT(
  VALUES(FactSales[ProductID]),
  VALUES(DimProduct[ProductID])
)

Freshness

MinFecha = MIN('Ventas'[Fecha])
MaxFecha = MAX('FechaCalendario'[Fecha])

Lineage

#"Renamed Columns" = Table.RenameColumns(Source, {{"Fecha", "TransactionDate"}})

6. Métodos de evaluación — Cómo verificar CONSISTENCY

Stress Test Visual

EVALUATE ROW(
   "Card", [Total Ventas],
   "Table", CALCULATE([Total Ventas], ALL('Ventas')),
   "Filtered", CALCULATE([Total Ventas], KEEPFILTERS('Productos'))
)

Auditoría de relaciones

Model.Relationships | summarize Count=count() by FromTable, ToTable

Validación de medidas

CALCULATE([KPI], REMOVEFILTERS())

7. Modelos aplicables — Frameworks de consistencia

Modelo 1 — Semantic Consistency Matrix

| Entidad | KPI | Definición | Fórmula |
| Ventas  | Total Ventas | Monto facturado | SUMX(Ventas, Monto) |
| Finanzas| Total Ventas | Ingresos netos  | SUMX(Ventas, Monto - Impuestos) |

Modelo 2 — DAX Truth Table

EVALUATE
ADDCOLUMNS(
   VALUES('Productos'[Categoria]),
   "Esperado", [Total Ventas Esperado],
   "Obtenido", [Total Ventas],
   "Consistente", IF([Total Ventas Esperado] = [Total Ventas], TRUE(), FALSE())
)

Modelo 3 — Granularity Alignment

Budget Diario =
DIVIDE(
   SUM(Budget[Monto]),
   COUNTROWS(VALUES('Calendario'[Fecha]))
)