Lección 15 de 36Modelado de Datos

Tabla de calendario: tu mejor aliado

Crea y usa tablas de fecha para time intelligence.

15 minutos

Has aprendido la teoría del modelado de datos. Ahora llega el momento de la verdad: detectar y solucionar problemas antes de que arruinen tu dashboard. En esta lección, verás los errores que cometen el 90% de principiantes y cómo solucionarlos en minutos.

Error 1: Relaciones N:N sin tabla puente

El síntoma

Power BI muestra esta advertencia:

"Puede que necesite crear una relación muchos a muchos entre estas tablas"

Tus visualizaciones muestran datos duplicados o totales incorrectos.

Por qué sucede

Intentaste relacionar dos tablas que ambas tienen valores duplicados en las columnas de relación.

Ejemplo problemático:

Estudiantes (N)             Cursos (N)
┌─────────────┐             ┌─────────────┐
│ EstudianteID│             │ CursoID     │
│ E001 (Juan) │  ←─────→   │ C001 (SQL)  │
│ E002 (María)│             │ C002 (Python)│
└─────────────┘             └─────────────┘
  • Juan toma SQL y Python
  • María toma SQL, Python y Power BI
  • ¿Cómo relacionas esto?

La solución correcta

Crear una tabla puente (bridge table) que capture las relaciones.

Paso 1: Crea la tabla Inscripciones

Inscripciones (tabla puente)
┌───────────────┬─────────┬──────────┐
│ InscripciónID │ EstudianteID │ CursoID │
├───────────────┼─────────┼──────────┤
│ 1             │ E001    │ C001     │
│ 2             │ E001    │ C002     │
│ 3             │ E002    │ C001     │
│ 4             │ E002    │ C002     │
│ 5             │ E002    │ C003     │
└───────────────┴─────────┴──────────┘

Paso 2: Crea dos relaciones 1:N

Estudiantes (1) ←── Inscripciones (N) ──→ Cursos (1)

Resultado: Ahora tienes dos relaciones 1:N en lugar de una N:N problemática.

Cómo detectarlo

Señales:

  • Power BI no detecta la relación automáticamente
  • Al crear la relación manualmente, ves el símbolo "∞ → ∞"
  • Las visualizaciones muestran duplicados

Diagnóstico:

  1. Revisa si ambas columnas tienen valores duplicados
  2. Pregúntate: "¿Una fila de A puede relacionarse con múltiples filas de B, y viceversa?"
  3. Si la respuesta es sí, necesitas una tabla puente

Error 2: Relacionar con columnas no únicas

El síntoma

Creas una relación y los datos se ven raros:

  • Totales duplicados
  • Visualizaciones muestran más filas de las esperadas
  • Power BI acepta la relación, pero los resultados son incorrectos

Por qué sucede

Usaste una columna que no es única en la tabla del lado "1" de la relación.

Ejemplo:

Clientes                    Ventas
┌───────────┬──────────┐   ┌─────────┬──────────┐
│ ClienteID │ Nombre   │   │ VentaID │ Nombre   │
├───────────┼──────────┤   ├─────────┼──────────┤
│ C001      │ Juan     │   │ 1       │ Juan     │
│ C002      │ María    │   │ 2       │ Juan     │
│ C003      │ Juan     │   │ 3       │ María    │
└───────────┴──────────┘   └─────────┴──────────┘

Problema: Hay dos clientes llamados "Juan". Si relacionas por nombre, Power BI no sabe cuál es cuál.

La solución correcta

Siempre relaciona por IDs únicos, no por nombres o descripciones.

Correcto:

Ventas[ClienteID] → Clientes[ClienteID]

Incorrecto:

Ventas[NombreCliente] → Clientes[Nombre]

Cómo detectarlo

Test de unicidad:

  1. Selecciona la tabla en Power BI Desktop
  2. Crea una medida temporal:
    Test Único = COUNTROWS(Clientes) = DISTINCTCOUNT(Clientes[ClienteID])
    
  3. Si el resultado es FALSE, hay duplicados

Solución preventiva:

  • Siempre usa columnas de ID para relaciones
  • Si la tabla no tiene ID, créalo en Power Query
  • Verifica que los IDs sean únicos antes de crear relaciones

Error 3: Tipos de datos no coinciden

El síntoma

Power BI no detecta la relación automáticamente. Cuando la creas manualmente, no funciona o muestra resultados en blanco.

Por qué sucede

Las columnas que intentas relacionar tienen tipos de datos diferentes.

Ejemplo:

Ventas                      Productos
┌─────────┬────────────┐   ┌────────────┬──────────┐
│ VentaID │ ProductoID │   │ ProductoID │ Nombre   │
├─────────┼────────────┤   ├────────────┼──────────┤
│ 1       │ 301        │   │ "301"      │ Laptop   │
│ 2       │ 428        │   │ "428"      │ iPhone   │
└─────────┴────────────┘   └────────────┴──────────┘
         (Número)                (Texto)

Power BI no puede emparejar 301 (número) con "301" (texto).

La solución correcta

En Power Query:

  1. Selecciona la columna ProductoID en cualquiera de las dos tablas
  2. Transforma → Tipo de datos → [elige el tipo correcto]
  3. Asegúrate de que ambas columnas sean del mismo tipo

Tipos comunes:

  • IDs numéricos → Número entero
  • Códigos alfanuméricos → Texto
  • Fechas → Fecha (no texto)

Cómo detectarlo

Vista Modelo:

  • Intenta crear la relación arrastrando una columna a otra
  • Si Power BI no la acepta, probablemente hay un problema de tipo de datos

Vista Datos:

  • Revisa el icono junto al nombre de la columna:
    • "123" = Número
    • "ABC" = Texto
    • Calendario = Fecha

Tabla de compatibilidad

Tipo en Tabla 1 Tipo en Tabla 2 ¿Compatible?
Número entero Número entero ✅ Sí
Número entero Texto ❌ No
Número decimal Número entero ⚠️ Funciona pero no recomendado
Texto Texto ✅ Sí
Fecha Fecha ✅ Sí
Fecha Texto (formato fecha) ❌ No

Error 4: Columnas de fecha sin tabla de fechas

El síntoma

  • No puedes usar filtros de fecha inteligentes (trimestre, año)
  • Las funciones DAX de tiempo no funcionan (SAMEPERIODLASTYEAR)
  • Las fechas se ordenan alfabéticamente en lugar de cronológicamente

Por qué sucede

Relacionaste directamente la tabla de hechos a través de una columna de fecha sin crear una tabla de fechas dedicada.

Modelo incorrecto:

[Ventas]
  - VentaID
  - Fecha  ← Usas esto directamente en visualizaciones
  - Monto

La solución correcta

Paso 1: Crea una tabla de fechas en Power Query

Tabla: Calendario
┌────────────┬──────┬─────┬───────────┬─────────┐
│ Fecha      │ Año  │ Mes │ Trimestre │ Día     │
├────────────┼──────┼─────┼───────────┼─────────┤
│ 2024-01-01 │ 2024 │ 1   │ Q1        │ Lunes   │
│ 2024-01-02 │ 2024 │ 1   │ Q1        │ Martes  │
│ ...        │ ...  │ ... │ ...       │ ...     │
└────────────┴──────┴─────┴───────────┴─────────┘

Paso 2: Crea la relación

Ventas[Fecha] → Calendario[Fecha] (N:1)

Paso 3: Marca la tabla de fechas

  1. Selecciona tabla Calendario
  2. Modelado → Marcar como tabla de fechas
  3. Selecciona la columna Fecha

Beneficios inmediatos

Antes:

Ventas Año Anterior =
CALCULATE(
    SUM(Ventas[Monto]),
    FILTER(
        ALL(Ventas),
        Ventas[Fecha] >= DATE(YEAR(TODAY())-1, 1, 1) &&
        Ventas[Fecha] <= DATE(YEAR(TODAY())-1, 12, 31)
    )
)

Después:

Ventas Año Anterior =
CALCULATE(
    SUM(Ventas[Monto]),
    SAMEPERIODLASTYEAR(Calendario[Fecha])
)

¡20 líneas vs 5 líneas!

Error 5: Dirección de filtro bidireccional sin razón

El síntoma

  • Dashboard lento sin razón aparente
  • Medidas DAX muestran resultados incorrectos
  • Power BI advierte "relación ambigua"

Por qué sucede

Cambiaste todas las relaciones a dirección "Ambas" pensando que sería más flexible.

Problema:

Productos ←──────→ Ventas ←──────→ Clientes
  (1)      Ambas    (N)     Ambas     (1)

Consecuencias:

  • Power BI no sabe en qué dirección aplicar los filtros
  • Cada consulta es más lenta (más caminos de cálculo)
  • Resultados impredecibles en medidas complejas

La solución correcta

Regla de oro: Usa dirección "Única" (Single) en el 95% de casos.

Solo usa "Ambas" cuando:

  1. Tienes una razón específica
  2. Entiendes las implicaciones
  3. Has probado que funciona correctamente

Ejemplo válido de "Ambas":

Quieres mostrar solo productos que tuvieron ventas en 2024:

Productos ←────→ Ventas
  (1)    Ambas    (N)

Ahora puedes filtrar Productos basándote en criterios de Ventas.

Cómo detectarlo

Vista Modelo:

  • Busca flechas en ambas direcciones (←→)
  • Si ves varias, pregúntate si realmente las necesitas

Test de rendimiento:

  1. Cambia relaciones a "Única"
  2. Prueba tu dashboard
  3. Si todo funciona igual, déjalo en "Única"

Error 6: Valores nulos en columnas de relación

El síntoma

  • Visualizaciones muestran menos filas de las esperadas
  • Aparece una fila "(en blanco)" en las visualizaciones
  • Los totales no cuadran

Por qué sucede

Tu tabla de hechos tiene valores nulos (NULL) en las columnas de ID.

Ejemplo:

Ventas
┌─────────┬────────────┬──────────┐
│ VentaID │ ProductoID │ Monto    │
├─────────┼────────────┼──────────┤
│ 1       │ 301        │ 1,500    │
│ 2       │ NULL       │ 2,000    │ ← Problema
│ 3       │ 428        │ 1,200    │
└─────────┴────────────┴──────────┘

Consecuencia: La venta #2 no se puede relacionar con ningún producto.

La solución correcta

Opción 1: Limpiar en el origen

Investiga por qué hay valores nulos y corrígelos en la base de datos de origen.

Opción 2: Crear categoría "Desconocido"

En Power Query:

= Table.ReplaceValue(
    Ventas,
    null,
    999,
    Replacer.ReplaceValue,
    {"ProductoID"}
)

En tabla Productos:

┌────────────┬──────────────┐
│ ProductoID │ Nombre       │
├────────────┼──────────────┤
│ 999        │ (Desconocido)│
└────────────┴──────────────┘

Opción 3: Filtrar nulos

Si los valores nulos representan datos inválidos, elimínalos:

= Table.SelectRows(Ventas, each [ProductoID] <> null)

Cómo detectarlo

En Power Query:

  1. Selecciona la columna de ID
  2. Vista → Vista de perfil de columna
  3. Revisa "Empty" y "Null" en las estadísticas

En visualizaciones:

  • Busca filas etiquetadas "(en blanco)"
  • Compara SUM de visualización vs total esperado

Error 7: Tabla de hechos con columnas calculadas pesadas

El síntoma

  • Archivo .pbix enorme (1+ GB)
  • Dashboard tarda minutos en cargar
  • Actualizar datos toma 30+ minutos

Por qué sucede

Agregaste columnas calculadas a la tabla de hechos con millones de filas.

Ejemplo:

// Columna calculada en tabla Ventas (2M de filas)
Margen % = (Ventas[Monto] - Ventas[Costo]) / Ventas[Monto]

Problema: Power BI calcula esto 2 millones de veces y guarda el resultado en cada fila.

La solución correcta

Usa medidas DAX en lugar de columnas calculadas:

// Medida (calcula solo cuando se visualiza)
Margen % =
DIVIDE(
    SUM(Ventas[Monto]) - SUM(Ventas[Costo]),
    SUM(Ventas[Monto])
)

Comparación

Aspecto Columna calculada Medida
Cuándo se calcula Al cargar datos Al visualizar
Espacio en disco Se guarda en cada fila No usa espacio
Rendimiento Lento con muchas filas Rápido
Uso Filtros, ejes, leyendas Valores, métricas

Regla práctica

Usa columna calculada para:

  • Categorizar (ej: "Alto", "Medio", "Bajo")
  • Concatenar texto (ej: Nombre completo)
  • En tablas de dimensiones (pocas filas)

Usa medida para:

  • Sumas, promedios, conteos
  • Cálculos porcentuales
  • En tablas de hechos (muchas filas)

Checklist de diagnóstico

Cuando tu dashboard no funciona como esperas:

Paso 1: Verifica relaciones

  • Todas las relaciones tienen cardinalidad correcta (generalmente 1:N)
  • No hay relaciones N:N directas (si hay, crea tabla puente)
  • Dirección de filtro es "Única" en el 95% de casos

Paso 2: Verifica columnas de relación

  • Las columnas relacionadas tienen el mismo tipo de datos
  • Las columnas del lado "1" tienen valores únicos
  • No hay valores nulos en columnas de relación

Paso 3: Verifica tabla de fechas

  • Tienes una tabla de fechas independiente
  • Está marcada como tabla de fechas
  • Cubre todo el rango de fechas de tus hechos

Paso 4: Verifica rendimiento

  • No hay columnas calculadas pesadas en tablas de hechos
  • El archivo .pbix no es excesivamente grande
  • Las visualizaciones cargan en < 5 segundos

Herramientas de diagnóstico

1. Vista Modelo

Busca:

  • Relaciones sin conectar (líneas punteadas)
  • Relaciones N:N (∞ → ∞)
  • Relaciones con dirección ambas (←→)

2. Analizador de rendimiento

Cómo usar:

  1. Vista → Analizador de rendimiento
  2. Iniciar grabación
  3. Interactúa con tu dashboard
  4. Detener grabación
  5. Revisa qué consultas tardan más

Busca:

  • Consultas que tardan > 3 segundos
  • Consultas que se repiten muchas veces

3. Medidas de prueba

Test de cardinalidad:

// Debe ser TRUE
Test Único Cliente =
COUNTROWS(Clientes) = DISTINCTCOUNT(Clientes[ClienteID])

Test de valores nulos:

// Debe ser 0
Nulos en ProductoID =
COUNTROWS(FILTER(Ventas, ISBLANK(Ventas[ProductoID])))

Ejercicio práctico

Dado este escenario, identifica los errores:

Modelo actual:

Pedidos ←──────→ Productos ←──────→ Categorías
  (N)    Ambas      (N)      Ambas      (1)

Pedidos tiene:
- PedidoID (único)
- ProductoNombre (texto)
- Fecha (texto "15-01-2024")
- Monto
- MargenCalculado (columna calculada: Monto * 0.30)

Errores identificados:

  1. ✗ Relación N:N entre Pedidos y Productos
  2. ✗ Relación por ProductoNombre en lugar de ProductoID
  3. ✗ Fecha es texto, no tipo Fecha
  4. ✗ No hay tabla de fechas
  5. ✗ Dirección "Ambas" sin justificación
  6. ✗ Columna calculada pesada en tabla de hechos
  7. ✗ Dimensiones conectadas en cadena (Productos → Categorías)

Puntos clave de esta lección

  • Relaciones N:N: Evítalas, crea una tabla puente en su lugar
  • Columnas de relación: Usa IDs únicos del mismo tipo de datos, sin nulos
  • Tabla de fechas: Siempre crea una independiente y márcala correctamente
  • Dirección de filtro: Usa "Única" el 95% del tiempo
  • Columnas calculadas: Úsalas en dimensiones, no en hechos (usa medidas)
  • Diagnóstico: Vista Modelo + Analizador de rendimiento + Medidas de prueba

Próximos pasos

Has completado el módulo de Modelado de Datos. Ahora sabes:

  • Qué es un modelo de datos y por qué importa
  • Cómo crear relaciones correctamente
  • Qué es un modelo estrella y cómo construirlo
  • Cómo detectar y solucionar errores comunes

En el siguiente módulo, aprenderás DAX (Data Analysis Expressions), el lenguaje de fórmulas que te permitirá crear métricas avanzadas y cálculos dinámicos en tus dashboards.


Quiz de comprensión

  1. ¿Qué es una tabla puente y cuándo la necesitas?
  2. ¿Por qué no deberías usar columnas de texto (como nombres) para crear relaciones?
  3. ¿Cuál es el problema de agregar columnas calculadas a una tabla de hechos con millones de filas?
  4. Si tu dashboard muestra una fila "(en blanco)" en las visualizaciones, ¿qué podría estar causando el problema?

Completaste esta leccion?

Marca esta leccion como completada. Tu progreso se guardara en tu navegador.