Lección 8 de 16 · Nivel 2: Intermedio
Tabla de fechas e inteligencia de tiempo: YTD, año anterior y variaciones
- ⏱ 9 min de lectura
- ❓ 3 preguntas de repaso
- ✍️ Ejercicio con solución
En esta lección
- Crear una tabla de calendario con DAX y marcarla como tabla de fechas.
- Calcular el acumulado del año (YTD), el año anterior y la variación porcentual.
- Comparar con el mes anterior y calcular promedios móviles.
- Evitar los errores típicos al comparar periodos incompletos.
"¿Cuánto llevamos en el año?", "¿Cómo vamos frente al año pasado?", "¿Crecimos respecto al mes anterior?". Son las preguntas que se hacen en toda reunión de resultados. DAX tiene funciones de inteligencia de tiempo que las responden con una línea, pero necesitan una pieza previa: una buena tabla de fechas. Esta lección cierra el nivel intermedio.
Por qué necesitas una tabla de calendario
Las funciones de inteligencia de tiempo necesitan una tabla con todas las fechas de un periodo, sin huecos (aunque un día no haya ventas), relacionada con las fechas de tus tablas de hechos. Además, una tabla de calendario propia te permite:
- Filtrar Ventas y Metas con la misma segmentación de fecha (ambas se relacionan con Calendario).
- Tener columnas útiles: año, trimestre, mes, nombre del mes, semana, año fiscal, día laborable.
- Ordenar los meses correctamente (enero, febrero… y no alfabéticamente).
Power BI crea por defecto una tabla de fechas oculta para cada columna de fecha. Cuando tienes tu propio calendario, desactívala en Archivo → Opciones y configuración → Opciones → Carga de datos → Fecha y hora automáticas (en el archivo actual): reduce el tamaño del modelo y evita confusiones.
Crear el calendario con DAX
En Modelado → Nueva tabla escribe:
Calendario =
ADDCOLUMNS (
CALENDAR ( DATE ( 2025, 1, 1 ), DATE ( 2026, 12, 31 ) ),
"Año", YEAR ( [Date] ),
"Mes Num", MONTH ( [Date] ),
"Mes", FORMAT ( [Date], "mmm" ),
"Año-Mes", FORMAT ( [Date], "yyyy-mm" ),
"Trimestre", "T" & QUARTER ( [Date] ),
"Día Semana Num", WEEKDAY ( [Date], 2 ),
"Es Fin de Semana", WEEKDAY ( [Date], 2 ) >= 6
)
- CALENDAR genera una tabla con una columna llamada
Datecon todas las fechas entre las dos indicadas. Elige un rango que cubra todos tus datos (puedes calcularlo conMINyMAXde Ventas[Fecha], o usarCALENDARAUTO()). - ADDCOLUMNS añade columnas calculadas a esa tabla.
WEEKDAY([Date], 2)devuelve 1 para el lunes y 7 para el domingo.- El idioma de los nombres de mes que devuelve FORMAT depende de la configuración regional del modelo.
También puedes crear el calendario en Power Query o importarlo de Excel. Lo importante es que tenga todas las fechas y las columnas que necesitas.
Tres pasos obligatorios
- Marcar como tabla de fechas: selecciona Calendario, Herramientas de tabla → Marcar como tabla de fechas y elige la columna Date.
- Relacionar Calendario[Date] con Ventas[Fecha] (1:*), y con la fecha de cualquier otra tabla de hechos (Metas, Pagos…).
- Ordenar el mes por su número: selecciona la columna Mes, Herramientas de columnas → Ordenar por columna → Mes Num. Si no, los meses salen en orden alfabético.
A partir de ahora, usa siempre las columnas de Calendario (Año, Mes) en los gráficos y segmentaciones, no la fecha de la tabla de hechos.
1. En tu gráfico los meses aparecen como "abr, ago, dic, ene…". ¿Qué haces?
"Ordenar por columna" indica a Power BI que use el número del mes para ordenar el nombre.
Las medidas de inteligencia de tiempo
Ventas YTD =
TOTALYTD ( [Ventas Totales], Calendario[Date] )
Ventas Año Anterior =
CALCULATE ( [Ventas Totales], SAMEPERIODLASTYEAR ( Calendario[Date] ) )
Var % Año Anterior =
DIVIDE ( [Ventas Totales] - [Ventas Año Anterior], [Ventas Año Anterior] )
Ventas YTD Año Anterior =
CALCULATE ( [Ventas YTD], SAMEPERIODLASTYEAR ( Calendario[Date] ) )
Var % YTD =
DIVIDE ( [Ventas YTD] - [Ventas YTD Año Anterior], [Ventas YTD Año Anterior] )
Ventas Mes Anterior =
CALCULATE ( [Ventas Totales], DATEADD ( Calendario[Date], -1, MONTH ) )
Todas usan CALCULATE (lección 7) para cambiar el contexto de fechas: SAMEPERIODLASTYEAR desplaza las fechas filtradas un año hacia atrás y DATEADD las desplaza el número de periodos que indiques.
El resultado, con números
Ventas de Distribuidora Andina (en miles de soles), con 2026 en las filas:
| Mes | Ventas | Ventas YTD | Año anterior | Var % AA | YTD año anterior | Var % YTD |
|---|---|---|---|---|---|---|
| ene | 112 | 112 | 100 | 12,0% | 100 | 12,0% |
| feb | 118 | 230 | 110 | 7,3% | 210 | 9,5% |
| mar | 135 | 365 | 120 | 12,5% | 330 | 10,6% |
| abr | 126 | 491 | 115 | 9,6% | 445 | 10,3% |
Lectura: abril creció un 9,6% frente a abril del año anterior, y en lo que va del año se acumula un crecimiento del 10,3%. Frente al mes anterior, abril cayó un 6,7% (126 frente a 135), pero eso puede ser estacional: por eso la comparación con el mismo mes del año anterior suele ser más justa.
2. Con la tabla anterior, ¿cuál es la variación de marzo frente a febrero de 2026?
(135 − 118) ÷ 118 = 0,144 = 14,4%. El 12,5% es la variación frente a marzo del año anterior.
Promedio móvil y periodos personalizados
Un promedio móvil de 3 meses suaviza los altibajos y muestra la tendencia:
Ventas Últimos 3 Meses =
CALCULATE (
[Ventas Totales],
DATESINPERIOD ( Calendario[Date], MAX ( Calendario[Date] ), -3, MONTH )
)
Promedio Móvil 3M = DIVIDE ( [Ventas Últimos 3 Meses], 3 )
En abril de 2026: (118 + 135 + 126) ÷ 3 = 126,3. DATESINPERIOD toma las fechas que van desde la última fecha del contexto hacia atrás el número de periodos indicado.
Año fiscal
Si tu año contable termina en otra fecha (por ejemplo, el 30 de junio), indícalo en TOTALYTD: TOTALYTD([Ventas Totales], Calendario[Date], "6/30"). Añade también una columna "Año Fiscal" al calendario.
El error de los periodos incompletos
El 15 de mayo, "Ventas YTD" de 2026 incluye hasta el 15 de mayo, pero si filtras el año 2026 completo, "Ventas YTD Año Anterior" usa como referencia el 31 de diciembre y suma todo 2025. Resultado: una caída falsa. Una solución habitual es marcar en el calendario qué fechas tienen datos y usar solo esas en la comparación.
Añade una columna calculada a la tabla Calendario:
Fecha con Ventas = Calendario[Date] <= MAX ( Ventas[Fecha] )
Y crea la medida comparable:
Ventas YTD AA Comparable =
CALCULATE (
[Ventas YTD],
CALCULATETABLE (
SAMEPERIODLASTYEAR ( Calendario[Date] ),
Calendario[Fecha con Ventas] = TRUE ()
)
)
CALCULATETABLE se queda con las fechas del contexto que tienen datos (por ejemplo, del 1 de enero al 15 de mayo de 2026), SAMEPERIODLASTYEAR las traslada a 2025 y el acumulado se calcula solo hasta el 15 de mayo de 2025. Así comparas el mismo tramo de ambos años.
3. ¿Qué requisito es imprescindible para que TOTALYTD y SAMEPERIODLASTYEAR funcionen bien?
Las funciones de inteligencia de tiempo trabajan sobre una columna de fechas sin huecos que cubra todo el periodo.
Ejercicio práctico: el informe de comparación
- Crea la tabla Calendario, márcala como tabla de fechas, relaciónala y ordena el mes por su número.
- Crea las medidas Ventas YTD, Ventas Año Anterior, Var % Año Anterior, Ventas Mes Anterior y Promedio Móvil 3M.
- Construye una matriz con Año-Mes en filas y estas medidas en valores, con formato condicional en las variaciones (verde si es positiva, rojo si es negativa).
- Crea un gráfico combinado: ventas del año en columnas y año anterior en línea.
Ver pistas
- Si Ventas Año Anterior sale en blanco, revisa que la relación use Calendario[Date] y que el calendario incluya el año anterior completo.
- Para el formato condicional de la variación: en la matriz, clic en la medida → Formato condicional → Color de fuente → Reglas: si el valor es ≥ 0, verde; si es < 0, rojo. Añade también un icono para no depender solo del color.
- Si los totales de la matriz te parecen raros en Var %, recuerda que se recalculan con los totales, no promediando las filas (lección 6).
Resumen
- Crea una tabla de calendario continua, márcala como tabla de fechas y relaciónala con todas las tablas de hechos.
- Ordena el nombre del mes por su número y usa las columnas del calendario en los objetos visuales.
- TOTALYTD, SAMEPERIODLASTYEAR, DATEADD y DATESINPERIOD resuelven acumulados, comparaciones y promedios móviles.
- Calcula las variaciones con DIVIDE y cuida las comparaciones de periodos incompletos.
¡Completaste el nivel intermedio! En la próxima lección empieza el nivel avanzado: informes interactivos con obtención de detalles, información sobre herramientas, marcadores y parámetros de campo.
Crea tu cuenta en 30 segundos, marca tus lecciones y descarga el certificado al terminar.