Time Intelligence: YTD, MTD, comparativos
Análisis temporal con funciones especializadas.
Los análisis temporales son el corazón de cualquier dashboard de negocio. Preguntas como "¿Cómo vamos vs el año pasado?" o "¿Cuánto llevamos acumulado este mes?" requieren funciones especializadas de DAX llamadas Time Intelligence.
¿Qué es Time Intelligence?
Time Intelligence es un conjunto de funciones DAX diseñadas para:
- Acumulados: Year-to-Date (YTD), Month-to-Date (MTD), Quarter-to-Date (QTD)
- Comparativos: vs año anterior, vs mes anterior, vs mismo período año pasado
- Períodos móviles: últimos 12 meses, últimos 30 días
- Navegación temporal: período anterior, siguiente período
El requisito fundamental: Tabla de fechas
Para que Time Intelligence funcione correctamente, necesitas una tabla de calendario (también llamada tabla de fechas) que cumpla con:
- Una fila por cada día del período de análisis
- Sin días faltantes (secuencia continua)
- Marcada como tabla de fechas en Power BI
- Relacionada con tu tabla de hechos (ventas)
Creando una tabla de fechas en DAX
Opción 1: CALENDAR
Calendario =
CALENDAR(
DATE(2020, 1, 1), -- Fecha inicio
DATE(2026, 12, 31) -- Fecha fin
)
Opción 2: CALENDARAUTO
// Automáticamente detecta el rango de fechas en tu modelo
Calendario = CALENDARAUTO()
Agregar columnas útiles al calendario
// Después de crear la tabla base, agrega columnas calculadas:
Año = YEAR(Calendario[Date])
Mes = MONTH(Calendario[Date])
Nombre Mes = FORMAT(Calendario[Date], "MMMM")
Nombre Mes Corto = FORMAT(Calendario[Date], "MMM")
Trimestre = "Q" & QUARTER(Calendario[Date])
Año-Mes = FORMAT(Calendario[Date], "YYYY-MM")
Día de Semana = WEEKDAY(Calendario[Date], 2) -- Lunes = 1
Nombre Día = FORMAT(Calendario[Date], "dddd")
Semana del Año = WEEKNUM(Calendario[Date], 2)
Es Fin de Semana = IF(WEEKDAY(Calendario[Date], 2) >= 6, "Sí", "No")
Marcar como tabla de fechas
En Power BI Desktop:
- Selecciona la tabla Calendario
- Ve a Herramientas de tabla
- Clic en Marcar como tabla de fechas
- Selecciona la columna de fecha
Importante: Sin marcar la tabla como tabla de fechas, las funciones de Time Intelligence pueden dar resultados incorrectos.
TOTALYTD: Acumulado del año
TOTALYTD (Total Year-to-Date) calcula el acumulado desde el inicio del año hasta la fecha actual del contexto.
Sintaxis
TOTALYTD(expresión, columna_fecha, [filtro], [fin_año])
Ejemplos básicos
// Ventas acumuladas del año
Ventas YTD =
TOTALYTD(
SUM(Ventas[Monto]),
Calendario[Date]
)
// Unidades acumuladas del año
Unidades YTD =
TOTALYTD(
SUM(Ventas[Cantidad]),
Calendario[Date]
)
// Transacciones acumuladas del año
Transacciones YTD =
TOTALYTD(
COUNTROWS(Ventas),
Calendario[Date]
)
Cómo funciona
Si estás viendo datos de marzo 2024:
| Mes | Ventas Mensuales | Ventas YTD |
|---|---|---|
| Enero 2024 | $100,000 | $100,000 |
| Febrero 2024 | $120,000 | $220,000 |
| Marzo 2024 | $150,000 | $370,000 |
| Abril 2024 | $130,000 | $500,000 |
| ... | ... | ... |
TOTALYTD automáticamente acumula desde enero hasta el mes seleccionado.
Año fiscal diferente
Si tu año fiscal no termina en diciembre:
// Año fiscal que termina el 30 de junio
Ventas YTD Fiscal =
TOTALYTD(
SUM(Ventas[Monto]),
Calendario[Date],
,
"6/30" -- Fin del año fiscal
)
TOTALMTD y TOTALQTD
TOTALMTD: Acumulado del mes
// Ventas acumuladas del mes
Ventas MTD =
TOTALMTD(
SUM(Ventas[Monto]),
Calendario[Date]
)
Si estás viendo el 15 de marzo:
- Suma las ventas del 1 al 15 de marzo
TOTALQTD: Acumulado del trimestre
// Ventas acumuladas del trimestre
Ventas QTD =
TOTALQTD(
SUM(Ventas[Monto]),
Calendario[Date]
)
Si estás en febrero (Q1):
- Suma enero + febrero
Comparativa de acumulados
| Función | Acumula desde |
|---|---|
TOTALMTD |
Inicio del mes |
TOTALQTD |
Inicio del trimestre |
TOTALYTD |
Inicio del año |
SAMEPERIODLASTYEAR: Comparativo año anterior
SAMEPERIODLASTYEAR devuelve el mismo período pero del año anterior.
Sintaxis
SAMEPERIODLASTYEAR(columna_fecha)
Ejemplo básico
// Ventas del mismo período, año anterior
Ventas Año Anterior =
CALCULATE(
SUM(Ventas[Monto]),
SAMEPERIODLASTYEAR(Calendario[Date])
)
Cómo funciona
| Contexto actual | SAMEPERIODLASTYEAR devuelve |
|---|---|
| Marzo 2024 | Marzo 2023 |
| Q1 2024 | Q1 2023 |
| Semana 10 de 2024 | Semana 10 de 2023 |
| 15-Mar-2024 | 15-Mar-2023 |
Crecimiento interanual (YoY)
// Crecimiento Year-over-Year
Crecimiento YoY =
VAR VentasActuales = SUM(Ventas[Monto])
VAR VentasAñoAnterior =
CALCULATE(
SUM(Ventas[Monto]),
SAMEPERIODLASTYEAR(Calendario[Date])
)
RETURN
VentasActuales - VentasAñoAnterior
// Porcentaje de crecimiento YoY
% Crecimiento YoY =
VAR VentasActuales = SUM(Ventas[Monto])
VAR VentasAñoAnterior =
CALCULATE(
SUM(Ventas[Monto]),
SAMEPERIODLASTYEAR(Calendario[Date])
)
RETURN
DIVIDE(VentasActuales - VentasAñoAnterior, VentasAñoAnterior, 0)
YTD comparativo
// YTD del año anterior
Ventas YTD Año Anterior =
CALCULATE(
[Ventas YTD],
SAMEPERIODLASTYEAR(Calendario[Date])
)
// Crecimiento YTD vs YTD Año Anterior
Crecimiento YTD = [Ventas YTD] - [Ventas YTD Año Anterior]
% Crecimiento YTD =
DIVIDE([Crecimiento YTD], [Ventas YTD Año Anterior], 0)
DATEADD: Navegación flexible
DATEADD te permite moverte cualquier cantidad de períodos hacia adelante o atrás.
Sintaxis
DATEADD(columna_fecha, número_intervalos, intervalo)
Intervalos disponibles: DAY, MONTH, QUARTER, YEAR
Ejemplos
// Ventas del mes anterior
Ventas Mes Anterior =
CALCULATE(
SUM(Ventas[Monto]),
DATEADD(Calendario[Date], -1, MONTH)
)
// Ventas del trimestre anterior
Ventas Trimestre Anterior =
CALCULATE(
SUM(Ventas[Monto]),
DATEADD(Calendario[Date], -1, QUARTER)
)
// Ventas de hace 2 años
Ventas 2 Años Atrás =
CALCULATE(
SUM(Ventas[Monto]),
DATEADD(Calendario[Date], -2, YEAR)
)
// Ventas de los últimos 30 días
Ventas Últimos 30 Días =
CALCULATE(
SUM(Ventas[Monto]),
DATEADD(Calendario[Date], -30, DAY)
)
Comparativo mes a mes (MoM)
// Variación vs mes anterior
Variación MoM =
VAR VentasActuales = SUM(Ventas[Monto])
VAR VentasMesAnterior =
CALCULATE(
SUM(Ventas[Monto]),
DATEADD(Calendario[Date], -1, MONTH)
)
RETURN
VentasActuales - VentasMesAnterior
% Variación MoM =
VAR VentasActuales = SUM(Ventas[Monto])
VAR VentasMesAnterior =
CALCULATE(
SUM(Ventas[Monto]),
DATEADD(Calendario[Date], -1, MONTH)
)
RETURN
DIVIDE(VentasActuales - VentasMesAnterior, VentasMesAnterior, 0)
Otras funciones de Time Intelligence
PARALLELPERIOD
Similar a DATEADD pero devuelve el período completo:
// Ventas del año anterior completo (no solo el mismo período)
Ventas Año Anterior Completo =
CALCULATE(
SUM(Ventas[Monto]),
PARALLELPERIOD(Calendario[Date], -1, YEAR)
)
PREVIOUSMONTH / PREVIOUSQUARTER / PREVIOUSYEAR
// Ventas del mes anterior
Ventas Mes Previo =
CALCULATE(
SUM(Ventas[Monto]),
PREVIOUSMONTH(Calendario[Date])
)
// Ventas del año anterior
Ventas Año Previo =
CALCULATE(
SUM(Ventas[Monto]),
PREVIOUSYEAR(Calendario[Date])
)
DATESBETWEEN: Rango específico
// Ventas de una fecha específica hasta hoy
Ventas desde Lanzamiento =
CALCULATE(
SUM(Ventas[Monto]),
DATESBETWEEN(
Calendario[Date],
DATE(2024, 1, 15), -- Fecha de lanzamiento
TODAY()
)
)
LASTDATE / FIRSTDATE
// Última fecha con ventas
Última Venta = LASTDATE(Calendario[Date])
// Primera fecha con ventas
Primera Venta = FIRSTDATE(Calendario[Date])
Rolling Periods: Últimos X meses
Para calcular promedios móviles y tendencias:
// Ventas de los últimos 12 meses (Rolling 12)
Ventas R12 =
CALCULATE(
SUM(Ventas[Monto]),
DATESINPERIOD(
Calendario[Date],
MAX(Calendario[Date]),
-12,
MONTH
)
)
// Promedio mensual de los últimos 12 meses
Promedio Mensual R12 =
DIVIDE([Ventas R12], 12, 0)
// Ventas de los últimos 3 meses (Rolling 3)
Ventas R3 =
CALCULATE(
SUM(Ventas[Monto]),
DATESINPERIOD(
Calendario[Date],
MAX(Calendario[Date]),
-3,
MONTH
)
)
Por qué son útiles los Rolling Periods
| Escenario | Uso |
|---|---|
| Estacionalidad | Rolling 12 elimina efecto estacional |
| Tendencias | Suaviza fluctuaciones mes a mes |
| Comparativos | Más estable que comparar meses individuales |
| Forecasting | Base más sólida para proyecciones |
Dashboard de métricas temporales
Aquí tienes un conjunto completo de medidas para un dashboard profesional:
Medidas base
// Ventas totales
Total Ventas = SUM(Ventas[Monto])
Medidas YTD
Ventas YTD =
TOTALYTD(SUM(Ventas[Monto]), Calendario[Date])
Ventas YTD Año Anterior =
CALCULATE(
TOTALYTD(SUM(Ventas[Monto]), Calendario[Date]),
SAMEPERIODLASTYEAR(Calendario[Date])
)
Crecimiento YTD = [Ventas YTD] - [Ventas YTD Año Anterior]
% Crecimiento YTD =
DIVIDE([Crecimiento YTD], [Ventas YTD Año Anterior], 0)
Medidas comparativas anuales
Ventas Año Anterior =
CALCULATE(
SUM(Ventas[Monto]),
SAMEPERIODLASTYEAR(Calendario[Date])
)
Crecimiento YoY = [Total Ventas] - [Ventas Año Anterior]
% Crecimiento YoY =
DIVIDE([Crecimiento YoY], [Ventas Año Anterior], 0)
Medidas comparativas mensuales
Ventas Mes Anterior =
CALCULATE(
SUM(Ventas[Monto]),
DATEADD(Calendario[Date], -1, MONTH)
)
Crecimiento MoM = [Total Ventas] - [Ventas Mes Anterior]
% Crecimiento MoM =
DIVIDE([Crecimiento MoM], [Ventas Mes Anterior], 0)
Medidas Rolling
Ventas R12 =
CALCULATE(
SUM(Ventas[Monto]),
DATESINPERIOD(Calendario[Date], MAX(Calendario[Date]), -12, MONTH)
)
Ventas R12 Año Anterior =
CALCULATE(
[Ventas R12],
SAMEPERIODLASTYEAR(Calendario[Date])
)
Crecimiento R12 = [Ventas R12] - [Ventas R12 Año Anterior]
% Crecimiento R12 =
DIVIDE([Crecimiento R12], [Ventas R12 Año Anterior], 0)
Visualizando métricas temporales
Tabla recomendada
| Período | Ventas | YTD | vs Año Ant | % Crec |
|---|---|---|---|---|
| Ene-24 | $100K | $100K | +$15K | +15% |
| Feb-24 | $120K | $220K | +$25K | +13% |
| Mar-24 | $150K | $370K | +$40K | +12% |
Gráfico de líneas
Muestra en el mismo gráfico:
- Ventas mensuales 2024 (línea sólida)
- Ventas mensuales 2023 (línea punteada)
- Tendencia Rolling 12 (línea secundaria)
KPIs con indicadores
┌─────────────────┬─────────────────┬─────────────────┐
│ Ventas YTD │ vs Año Ant. │ % Crecimiento │
│ $1,234,567 │ +$145,000 │ +12.3% │
│ │ ▲ │ ▲ │
└─────────────────┴─────────────────┴─────────────────┘
Errores comunes en Time Intelligence
Error 1: Tabla de fechas incompleta
Problema: Faltan días en tu tabla de calendario
Síntoma: YTD da resultados extraños o nulos
Solución: Asegura una secuencia continua de fechas
Error 2: No marcar tabla de fechas
Problema: No marcaste la tabla como "tabla de fechas"
Síntoma: Funciones de Time Intelligence inconsistentes
Solución: Herramientas de tabla > Marcar como tabla de fechas
Error 3: Múltiples relaciones de fecha
Problema: Tu tabla de hechos tiene Fecha Orden y Fecha Envío
Síntoma: Confusión sobre qué fecha usa Time Intelligence
Solución: Usa USERELATIONSHIP en medidas específicas
Ventas por Fecha Envío =
CALCULATE(
SUM(Ventas[Monto]),
USERELATIONSHIP(Ventas[Fecha Envío], Calendario[Date])
)
Error 4: Comparar períodos incompletos
Problema: Comparas marzo completo de 2023 con marzo parcial de 2024
Síntoma: Parece que las ventas bajaron pero es porque el mes no terminó
Solución: Usa lógica de "hasta el mismo día"
Ventas Comparable =
VAR UltimoDíaActual = MAX(Calendario[Día del Mes])
RETURN
CALCULATE(
SUM(Ventas[Monto]),
SAMEPERIODLASTYEAR(Calendario[Date]),
Calendario[Día del Mes] <= UltimoDíaActual
)
Referencia rápida de funciones
| Función | Descripción | Ejemplo de uso |
|---|---|---|
TOTALYTD |
Acumulado del año | YTD de ventas |
TOTALMTD |
Acumulado del mes | MTD de ventas |
TOTALQTD |
Acumulado del trimestre | QTD de ventas |
SAMEPERIODLASTYEAR |
Mismo período, año anterior | Comparativo anual |
DATEADD |
Mover período | Mes anterior, -30 días |
PARALLELPERIOD |
Período paralelo completo | Año completo anterior |
PREVIOUSMONTH |
Mes anterior | Ventas mes previo |
PREVIOUSYEAR |
Año anterior | Ventas año previo |
DATESINPERIOD |
Rango de fechas | Rolling 12 meses |
DATESBETWEEN |
Entre dos fechas | Rango específico |
FIRSTDATE |
Primera fecha | Inicio de período |
LASTDATE |
Última fecha | Fin de período |
Puntos clave de esta lección
- Time Intelligence requiere una tabla de fechas continua y marcada
- TOTALYTD/MTD/QTD calculan acumulados del período
- SAMEPERIODLASTYEAR compara con el año anterior
- DATEADD permite moverse cualquier cantidad de períodos
- Rolling periods (R12, R3) suavizan estacionalidad
- Combina estas funciones con CALCULATE para análisis potentes
- Siempre verifica que compares períodos equivalentes
Próximos pasos
Con estas funciones de Time Intelligence, puedes crear dashboards profesionales con:
- Comparativos año contra año
- Análisis de tendencias
- KPIs con variaciones temporales
- Forecasting básico
En el siguiente módulo aplicarás todo lo aprendido de DAX para crear visualizaciones impactantes.
Quiz de comprensión
¿Qué requisitos debe cumplir una tabla de fechas para que Time Intelligence funcione correctamente?
¿Cuál es la diferencia entre TOTALYTD y SAMEPERIODLASTYEAR?
Escribe una medida DAX para calcular las ventas del mes anterior.
¿Qué función usarías para calcular las ventas de los últimos 6 meses?
¿Cómo calcularías el porcentaje de crecimiento Year-over-Year?
¿Por qué es importante "marcar como tabla de fechas" en Power BI?
Tienes ventas hasta el 15 de marzo de 2024. ¿Cómo harías un comparativo justo con marzo 2023?
Completaste esta leccion?
Marca esta leccion como completada. Tu progreso se guardara en tu navegador.