3.2Inteligencia de tiempo: acumulados (YTD) y comparación N-1
Lo esencial en 30 segundos
- La pregunta n.º 1 de toda dirección — «¿cómo vamos frente al año pasado?» — se responde con tres funciones: TOTALYTD (acumulado), SAMEPERIODLASTYEAR (mismo periodo N-1) y DATEADD (desplazamiento genérico).
- Requisito absoluto: la tabla de fechas marcada — sin ella, estas funciones devuelven resultados falsos, sobre todo el acumulado y la comparación.
- La evolución se expresa siempre en valor Y en %: ambas medidas van en pareja, y el conjunto forma el cuarteto de pilotaje.
Mini-caso continuo — Zineb responde a la dirección de un vistazo
La dirección de la pyme agroalimentaria de Zineb pregunta cada lunes: «¿cómo vamos respecto al año pasado?». En lugar de recalcular a mano, Zineb aplica la sección: primero comprueba que su tabla de fechas esté bien marcada (requisito absoluto), y luego construye el cuarteto — Ventas YTD = TOTALYTD([Total Ventas], Fechas[Fecha]) para el acumulado desde enero, Ventas N-1 = CALCULATE([Total Ventas], SAMEPERIODLASTYEAR(Fechas[Fecha])) para el mismo periodo un año antes, y después la evolución en valor y en %. Las coloca en una matriz Mes × 4 medidas: la respuesta a la dirección cabe en un solo visual, y el acumulado sube antes de reiniciarse en enero.
Caso autónomo de esta sección: reaparece en el curso, el esquema, el guion y el reto de 48 h de la sección 3.2.
1. Las tres funciones estrella
La inteligencia de tiempo DAX responde a la pregunta n.º 1 de toda dirección con tres funciones: TOTALYTD (el acumulado desde el inicio del año), SAMEPERIODLASTYEAR (el mismo periodo un año antes) y DATEADD (el desplazamiento genérico, más flexible). Nunca calculan «solas»: desplazan un periodo en el tiempo.
2. El requisito no negociable
Requisito absoluto: la tabla de fechas marcada como tabla de fechas. Sin ella, estas funciones mienten — unas ventas N-1 vacías o un acumulado falso vienen casi siempre de ahí. Zineb verifica este ajuste antes de dudar de su fórmula.
3. El cuarteto de pilotaje
Se compone el cuarteto estándar de todo informe de dirección: Ventas YTD, Ventas N-1, evolución en valor y evolución en %. Estas medidas se construyen una vez bien y se copian de plantilla en plantilla. La evolución se expresa siempre en valor Y en %: ambas van en pareja.
🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Las medidas temporales
El cuarteto estándar, reutilizable en todos los modelos de Zineb:
Ventas YTD = TOTALYTD([Total Ventas], Fechas[Fecha])
Ventas N-1 = CALCULATE([Total Ventas], SAMEPERIODLASTYEAR(Fechas[Fecha]))
Evol = [Total Ventas] - [Ventas N-1]
Evol % = DIVIDE([Total Ventas] - [Ventas N-1], [Ventas N-1]) // formato %
Lectura: TOTALYTD acumula desde enero y se reinicia a comienzos de año; SAMEPERIODLASTYEAR desplaza el cálculo un año atrás.
Lección: DIVIDE([Total Ventas] - [Ventas N-1], [Ventas N-1]) da la diferencia relativa — la evolución va en pareja valor + %.
Vocabulario de la sección
- Inteligencia de tiempo
- La familia de funciones DAX que manipulan periodos (acumulados, desplazamientos, comparaciones), todas apoyadas en la tabla de fechas.
Ejemplo sencillo: Zineb recurre a ella para el acumulado anual y la comparación N-1 de la pyme.
Lo que no es: un simple filtro de fechas puesto a mano sobre un visual.
Reflejo: comparar periodos → inteligencia de tiempo.
- TOTALYTD
- El acumulado anual desde el inicio del año: TOTALYTD([Total Ventas], Fechas[Fecha]).
Ejemplo sencillo: Zineb sigue las ventas acumuladas desde enero para la dirección.
Lo que no es: las ventas del mes solo, sin acumulado.
Reflejo: acumulado anual → TOTALYTD.
- SAMEPERIODLASTYEAR
- El mismo periodo un año antes: CALCULATE([Total Ventas], SAMEPERIODLASTYEAR(Fechas[Fecha])).
Ejemplo sencillo: Zineb compara el mes actual con el mismo mes del año pasado.
Lo que no es: un periodo cualquiera sin referencia de fecha.
Reflejo: comparación N-1 → SAMEPERIODLASTYEAR.
- DATEADD
- El desplazamiento genérico: DATEADD(Fechas[Fecha], -1, MONTH) para el mes anterior — más flexible que las funciones dedicadas.
Ejemplo sencillo: Zineb lo usa para un desplazamiento a medida.
Lo que no es: una función fijada a un solo tipo de periodo.
Reflejo: desplazamiento a medida → DATEADD.
- Evolución N-1
- El dúo final: Evol = [Ventas] - [Ventas N-1] y Evol % = DIVIDE([Ventas] - [Ventas N-1], [Ventas N-1]).
Ejemplo sencillo: Zineb muestra la diferencia en valor y en % lado a lado.
Lo que no es: una evolución en valor solo, sin magnitud relativa.
Reflejo: siempre valor Y porcentaje.
En la práctica — En la práctica — El cuarteto de pilotaje
- Cree Ventas YTD = TOTALYTD([Total Ventas], Fechas[Fecha]) y compruebe en una matriz Mes × medidas: el acumulado sube y se reinicia en enero, como en casa de Zineb.
- Cree Ventas N-1 = CALCULATE([Total Ventas], SAMEPERIODLASTYEAR(Fechas[Fecha])) (necesita un histórico de dos años — duplique las ventas desplazadas un año en el CSV si hace falta).
- Complete Evol % = DIVIDE([Total Ventas] - [Ventas N-1], [Ventas N-1]) en formato %.
- Componga la matriz de pilotaje: Mes en filas, las 4 medidas en valores — la respuesta a «¿cómo vamos?» cabe en un visual.
Guion paso a paso — el cuarteto de Zineb (10 min)
1) Compruebe que su tabla de fechas esté marcada como tabla de fechas (Herramientas de tabla). 2) Cree Ventas YTD = TOTALYTD([Total Ventas], Fechas[Fecha]). 3) Cree Ventas N-1 = CALCULATE([Total Ventas], SAMEPERIODLASTYEAR(Fechas[Fecha])). 4) Añada Evol = [Total Ventas] - [Ventas N-1] y Evol % = DIVIDE([Total Ventas] - [Ventas N-1], [Ventas N-1]) en %. 5) Coloque Mes en filas y las 4 medidas en valores: lea la respuesta a la dirección de un solo vistazo.
¿Ventas N-1 vacías? Verifique en orden: tabla de fechas marcada, relación activa sobre la columna correcta, histórico que cubra el año anterior.
Plantilla copiar-pegar — el cuarteto temporal
Ventas YTD = TOTALYTD([Total Ventas], Fechas[Fecha])
Ventas N-1 = CALCULATE([Total Ventas], SAMEPERIODLASTYEAR(Fechas[Fecha]))
Evol = [Total Ventas] - [Ventas N-1]
Evol % = DIVIDE([Total Ventas] - [Ventas N-1], [Ventas N-1]) // %
Requisito: tabla de fechas MARCADA. Reflejo: evolución = valor + %.
Acumulado anual
Zineb sigue las ventas acumuladas desde enero (TOTALYTD): la curva sube y se reinicia en cada año nuevo.
Mismo mes N-1
Zineb compara el mes actual con el mismo mes un año antes (SAMEPERIODLASTYEAR) para suavizar la estacionalidad.
Mes anterior
Zineb desplaza un mes con DATEADD para seguir la tendencia de corto plazo.
Ejercicio fiscal desplazado
Cierre en junio: Zineb pasa la fecha de fin de ejercicio a TOTALYTD para respetar el ejercicio fiscal de la pyme.
✓ Buenas prácticas
- Apoyarse en la tabla de fechas marcada: es el requisito no negociable.
- Construir estas medidas una vez bien: se copian de plantilla en plantilla.
- Expresar la evolución en valor Y en % (las dos van en pareja).
✗ Errores frecuentes
- Olvidar marcar la tabla de fechas (las funciones mienten).
- Hacer pasar la relación de fecha por la columna equivocada.
- Esperar unas ventas N-1 sin histórico que cubra el año anterior.
Puntos clave
- Toda la inteligencia de tiempo se apoya en la tabla de fechas MARCADA: el requisito no era opcional.
- TOTALYTD, SAMEPERIODLASTYEAR, DATEADD: tres funciones cubren las demandas habituales.
- La evolución se expresa en valor Y en %: ambas medidas van en pareja.
- Construya estas medidas una vez bien: se copian de plantilla en plantilla toda su carrera.
Reto de 48 h — aplíquelo mañana
Construya el cuarteto de pilotaje de Zineb sobre sus datos: Ventas YTD, Ventas N-1, evolución en valor y en %. Colóquelo en una matriz Mes × medidas y luego verifique que el acumulado se reinicia bien en enero y que su tabla de fechas está marcada.
- Sé escribir un acumulado anual con TOTALYTD.
- Sé comparar un periodo con N-1 con SAMEPERIODLASTYEAR.
- Conozco el requisito: la tabla de fechas marcada.
Preguntas frecuentes
Mis ventas N-1 salen vacías o falsas: ¿por qué?
Tres sospechosos, que hay que verificar en este orden (uno de ellos es la causa en el 95 % de los casos): la tabla de fechas no está marcada como tabla de fechas; la relación pasa por la columna de fecha equivocada (o está inactiva); el histórico no cubre el N-1 (las ventas N-1 de enero quedan entonces vacías, lo cual es normal). Empiece siempre por la tabla de fechas marcada.
¿Cómo gestionar un ejercicio fiscal desplazado (cierre en junio)?
TOTALYTD acepta un tercer argumento, la fecha de fin de ejercicio: TOTALYTD([Ventas], Fechas[Fecha], "30/06") acumula desde el 1 de julio. Para necesidades más complejas, se enriquece la tabla de fechas con columnas fiscales (AñoFiscal, MesFiscal) — la belleza de tener su propia tabla de calendario controlada.
¿Qué requisito absoluto hace falta para que funcione la inteligencia de tiempo?