Tabla de calendario: tu mejor aliado
Crea y usa tablas de fecha para time intelligence.
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:
- Revisa si ambas columnas tienen valores duplicados
- Pregúntate: "¿Una fila de A puede relacionarse con múltiples filas de B, y viceversa?"
- 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:
- Selecciona la tabla en Power BI Desktop
- Crea una medida temporal:
Test Único = COUNTROWS(Clientes) = DISTINCTCOUNT(Clientes[ClienteID]) - 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:
- Selecciona la columna ProductoID en cualquiera de las dos tablas
- Transforma → Tipo de datos → [elige el tipo correcto]
- 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
- Selecciona tabla Calendario
- Modelado → Marcar como tabla de fechas
- 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:
- Tienes una razón específica
- Entiendes las implicaciones
- 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:
- Cambia relaciones a "Única"
- Prueba tu dashboard
- 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:
- Selecciona la columna de ID
- Vista → Vista de perfil de columna
- 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:
- Vista → Analizador de rendimiento
- Iniciar grabación
- Interactúa con tu dashboard
- Detener grabación
- 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:
- ✗ Relación N:N entre Pedidos y Productos
- ✗ Relación por ProductoNombre en lugar de ProductoID
- ✗ Fecha es texto, no tipo Fecha
- ✗ No hay tabla de fechas
- ✗ Dirección "Ambas" sin justificación
- ✗ Columna calculada pesada en tabla de hechos
- ✗ 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
- ¿Qué es una tabla puente y cuándo la necesitas?
- ¿Por qué no deberías usar columnas de texto (como nombres) para crear relaciones?
- ¿Cuál es el problema de agregar columnas calculadas a una tabla de hechos con millones de filas?
- 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.