3.2Time intelligence : cumuls (YTD) & comparaison N-1
L'essentiel en 30 secondes
- La question n°1 de toute direction — « où en est-on vs l'an dernier ? » — se répond avec trois fonctions : TOTALYTD (cumul), SAMEPERIODLASTYEAR (même période N-1) et DATEADD (décalage générique).
- Prérequis absolu : la table de dates marquée — sans elle, ces fonctions renvoient des résultats faux, surtout le cumul et la comparaison.
- L'évolution s'exprime toujours en valeur ET en % : les deux mesures vont par paire, et l'ensemble forme le quatuor de pilotage.
Mini-cas filé — Zineb répond à la direction en un regard
La direction de la PME agroalimentaire de Zineb demande chaque lundi : « où en est-on par rapport à l'an dernier ? ». Plutôt que de recalculer à la main, Zineb applique la section : elle vérifie d'abord que sa table de dates est bien marquée (prérequis absolu), puis construit le quatuor — CA YTD = TOTALYTD([Total CA]; Dates[Date]) pour le cumul depuis janvier, CA N-1 = CALCULATE([Total CA]; SAMEPERIODLASTYEAR(Dates[Date])) pour la même période un an plus tôt, puis l'évolution en valeur et en %. Elle les pose dans une matrice Mois × 4 mesures : la réponse à la direction tient sur un seul visuel, et le cumul grimpe avant de repartir en janvier.
Cas autonome de cette section : il revient dans le cours, le schéma, le script et le défi 48h de la section 3.2.
1. Les trois fonctions phares
La time intelligence DAX répond à la question n°1 de toute direction avec trois fonctions : TOTALYTD (le cumul depuis le début d'année), SAMEPERIODLASTYEAR (la même période un an plus tôt) et DATEADD (le décalage générique, plus souple). Elles ne calculent jamais « toutes seules » : elles déplacent une période dans le temps.
2. Le prérequis non négociable
Prérequis absolu : la table de dates marquée comme table de dates. Sans elle, ces fonctions mentent — un CA N-1 vide ou un cumul faux vient presque toujours de là. Zineb vérifie ce réglage avant de douter de sa formule.
3. Le quatuor de pilotage
On assemble le quatuor standard de tout rapport de direction : CA YTD, CA N-1, évolution en valeur et évolution en %. Ces mesures se construisent une fois proprement et se copient de modèle en modèle. L'évolution s'exprime toujours en valeur ET en % : les deux vont par paire.
🔎 Exemple concret — 🔎 Exemple concret — Les mesures temporelles
Le quatuor standard, réutilisable sur tous les modèles de Zineb :
CA YTD = TOTALYTD([Total CA]; Dates[Date])
CA N-1 = CALCULATE([Total CA]; SAMEPERIODLASTYEAR(Dates[Date]))
Evol = [Total CA] - [CA N-1]
Evol % = DIVIDE([Total CA] - [CA N-1]; [CA N-1]) // format %
Lecture : TOTALYTD cumule depuis janvier et repart à zéro en début d'année ; SAMEPERIODLASTYEAR décale le calcul d'un an en arrière.
Leçon : DIVIDE([Total CA] - [CA N-1]; [CA N-1]) donne l'écart relatif — l'évolution va par paire valeur + %.
Vocabulaire de la section
- Time intelligence
- La famille de fonctions DAX qui manipulent les périodes (cumuls, décalages, comparaisons), toutes appuyées sur la table de dates.
Exemple simple : Zineb y recourt pour le cumul annuel et la comparaison N-1 de la PME.
Ce que ce n'est pas : un simple filtre de dates posé à la main sur un visuel.
Réflexe : comparer des périodes → time intelligence.
- TOTALYTD
- Le cumul annuel depuis le début de l'année : TOTALYTD([Total CA]; Dates[Date]).
Exemple simple : Zineb suit le CA cumulé depuis janvier pour la direction.
Ce que ce n'est pas : le CA du mois seul, sans cumul.
Réflexe : cumul annuel → TOTALYTD.
- SAMEPERIODLASTYEAR
- La même période un an plus tôt : CALCULATE([Total CA]; SAMEPERIODLASTYEAR(Dates[Date])).
Exemple simple : Zineb compare le mois courant au même mois de l'an dernier.
Ce que ce n'est pas : une période quelconque sans repère de date.
Réflexe : comparaison N-1 → SAMEPERIODLASTYEAR.
- DATEADD
- Le décalage générique : DATEADD(Dates[Date]; -1; MONTH) pour le mois précédent — plus flexible que les fonctions dédiées.
Exemple simple : Zineb l'utilise pour un décalage sur mesure.
Ce que ce n'est pas : une fonction figée sur un seul type de période.
Réflexe : décalage sur mesure → DATEADD.
- Évolution N-1
- Le duo final : Evol = [CA] - [CA N-1] et Evol % = DIVIDE([CA] - [CA N-1]; [CA N-1]).
Exemple simple : Zineb affiche l'écart en valeur et en % côte à côte.
Ce que ce n'est pas : une évolution en valeur seule, sans ampleur relative.
Réflexe : toujours valeur ET pourcentage.
En pratique — En pratique — Le quatuor de pilotage
- Créez CA YTD = TOTALYTD([Total CA]; Dates[Date]) et vérifiez dans une matrice Mois × mesures : le cumul grimpe puis repart en janvier, comme chez Zineb.
- Créez CA N-1 = CALCULATE([Total CA]; SAMEPERIODLASTYEAR(Dates[Date])) (nécessite un historique sur deux ans — dupliquez les ventes décalées d'un an dans le CSV si besoin).
- Complétez Évol % = DIVIDE([Total CA] - [CA N-1]; [CA N-1]) en format %.
- Assemblez la matrice de pilotage : Mois en lignes, les 4 mesures en valeurs — la réponse à « où en est-on ? » tient sur un visuel.
Script pas-à-pas — le quatuor de Zineb (10 min)
1) Vérifiez que votre table de dates est marquée comme table de dates (Outils de table). 2) Créez CA YTD = TOTALYTD([Total CA]; Dates[Date]). 3) Créez CA N-1 = CALCULATE([Total CA]; SAMEPERIODLASTYEAR(Dates[Date])). 4) Ajoutez Evol = [Total CA] - [CA N-1] et Evol % = DIVIDE([Total CA] - [CA N-1]; [CA N-1]) en %. 5) Posez Mois en lignes et les 4 mesures en valeurs : lisez la réponse à la direction d'un seul regard.
Un CA N-1 vide ? Vérifiez dans l'ordre : table de dates marquée, relation active sur la bonne colonne, historique couvrant l'année précédente.
Modèle copier-coller — le quatuor temporel
CA YTD = TOTALYTD([Total CA]; Dates[Date])
CA N-1 = CALCULATE([Total CA]; SAMEPERIODLASTYEAR(Dates[Date]))
Evol = [Total CA] - [CA N-1]
Evol % = DIVIDE([Total CA] - [CA N-1]; [CA N-1]) // %
Prérequis : table de dates MARQUÉE. Réflexe : évolution = valeur + %.
Cumul annuel
Zineb suit le CA cumulé depuis janvier (TOTALYTD) : la courbe grimpe puis repart à chaque nouvelle année.
Même mois N-1
Zineb compare le mois courant au même mois un an plus tôt (SAMEPERIODLASTYEAR) pour lisser la saisonnalité.
Mois précédent
Zineb décale d'un mois avec DATEADD pour suivre la tendance de court terme.
Exercice fiscal décalé
Clôture en juin : Zineb passe la date de fin d'exercice à TOTALYTD pour respecter l'exercice fiscal de la PME.
✓ Bonnes pratiques
- S'appuyer sur la table de dates marquée : c'est le prérequis non négociable.
- Construire ces mesures une fois proprement : elles se copient de modèle en modèle.
- Exprimer l'évolution en valeur ET en % (les deux vont par paire).
✗ Pièges fréquents
- Oublier de marquer la table de dates (les fonctions mentent).
- Faire passer la relation date par la mauvaise colonne.
- Attendre un CA N-1 sans historique couvrant l'année précédente.
Points clés à retenir
- Toute la time intelligence repose sur la table de dates MARQUÉE : le prérequis n'était pas optionnel.
- TOTALYTD, SAMEPERIODLASTYEAR, DATEADD : trois fonctions couvrent les demandes courantes.
- L'évolution s'exprime en valeur ET en % : les deux mesures vont par paire.
- Construisez ces mesures une fois proprement : elles se copient de modèle en modèle toute votre carrière.
Défi 48h — appliquez demain
Construisez le quatuor de pilotage de Zineb sur vos données : CA YTD, CA N-1, évolution en valeur et en %. Posez-le dans une matrice Mois × mesures, puis vérifiez que le cumul repart bien en janvier et que votre table de dates est marquée.
- Je peux écrire un cumul annuel avec TOTALYTD.
- Je sais comparer une période à N-1 avec SAMEPERIODLASTYEAR.
- Je connais le prérequis : la table de dates marquée.
Questions fréquentes
Mon CA N-1 affiche vide ou faux : pourquoi ?
Trois suspects, à vérifier dans cet ordre (l'un d'eux est en cause à 95 %) : la table de dates n'est pas marquée comme table de dates ; la relation passe par la mauvaise colonne de date (ou est inactive) ; l'historique ne couvre pas N-1 (le N-1 de janvier est alors vide, ce qui est normal). Commencez toujours par la table de dates marquée.
Comment gérer un exercice fiscal décalé (clôture en juin) ?
TOTALYTD accepte un troisième argument, la date de fin d'exercice : TOTALYTD([CA]; Dates[Date]; "30/06") cumule depuis le 1er juillet. Pour des besoins plus complexes, on enrichit la table de dates de colonnes fiscales (AnnéeFiscale, MoisFiscal) — la beauté d'avoir sa propre table calendrier maîtrisée.
Quel prérequis absolu pour que la time intelligence fonctionne ?