Lección 19 de 36DAX Esencial

Time Intelligence: YTD, MTD, comparativos

Análisis temporal con funciones especializadas.

25 minutos

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:

  1. Una fila por cada día del período de análisis
  2. Sin días faltantes (secuencia continua)
  3. Marcada como tabla de fechas en Power BI
  4. 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:

  1. Selecciona la tabla Calendario
  2. Ve a Herramientas de tabla
  3. Clic en Marcar como tabla de fechas
  4. 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

  1. ¿Qué requisitos debe cumplir una tabla de fechas para que Time Intelligence funcione correctamente?

  2. ¿Cuál es la diferencia entre TOTALYTD y SAMEPERIODLASTYEAR?

  3. Escribe una medida DAX para calcular las ventas del mes anterior.

  4. ¿Qué función usarías para calcular las ventas de los últimos 6 meses?

  5. ¿Cómo calcularías el porcentaje de crecimiento Year-over-Year?

  6. ¿Por qué es importante "marcar como tabla de fechas" en Power BI?

  7. 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.