2.5Hiérarchies & table de dates (calendrier)
L'essentiel en 30 secondes
- L'analyse temporelle exige une table de dates dédiée : une ligne par jour, continue, reliée à la date des faits et marquée comme table de dates.
- On la génère en DAX : CALENDARAUTO() (balaie les dates du modèle) ou CALENDAR(début; fin) (bornes explicites).
- On trie les mois par une colonne numérique (NumMois) et on construit la hiérarchie Année → Trimestre → Mois → Jour pour rendre chaque visuel explorable.
Mini-cas filé — Zineb bâtit LE calendrier de son modèle
Zineb, contrôleuse de gestion dans une PME agroalimentaire à Alger, veut suivre l'évolution mensuelle du chiffre d'affaires, mais ses mois s'affichent dans le désordre (avril avant janvier). Elle applique la section : elle crée une table de dates dédiée Dates = CALENDARAUTO(), ajoute Année, Mois, NumMois et Trimestre, trie Mois par NumMois, relie Dates[Date] à Ventes[Date] puis Marque comme table de dates. Enfin elle crée la hiérarchie Année → Trimestre → Mois → Jour et l'utilise dans sa courbe d'évolution : les boutons d'exploration apparaissent. Elle note le réflexe : désactiver la hiérarchie de dates automatique de Power BI.
Cas autonome de cette section : il revient dans le cours, le schéma, le script et le défi 48h de la section 2.5.
1. La table de dates dédiée
L'analyse temporelle — évolution, cumuls, comparaison N-1 — exige une fondation : la table de dates dédiée. Une dimension calendrier avec une ligne par jour, continue sur la période, ses colonnes Année/Trimestre/Mois/Jour, marquée comme « table de dates » et reliée aux faits. Sans elle, la time intelligence ne fonctionne pas fiablement ; avec elle, tout devient simple. Zineb la génère en DAX : CALENDARAUTO() ou CALENDAR(début; fin).
2. Trier les mois
Piège classique : « avril » se classe avant « janvier » en alphabétique. On règle cela en triant la colonne Mois par une colonne numérique NumMois (Outils de colonne → Trier par colonne). Zineb crée toujours NumMois = MONTH(Dates[Date]) à côté de son libellé de mois.
3. Hiérarchie & un seul calendrier
On construit ensuite la hiérarchie Année → Trimestre → Mois → Jour, qui rend chaque visuel temporel explorable (drill down). Et une seule table de dates sert tout le modèle : toutes les analyses temporelles s'y branchent. Zineb désactive la hiérarchie de dates automatique de Power BI, qui crée une table cachée par colonne et alourdit le fichier.
🔎 Exemple concret — 🔎 Exemple concret — Le calendrier en DAX
Zineb génère et complète sa table de dates :
Dates = CALENDARAUTO()
Année = YEAR(Dates[Date])
Mois = FORMAT(Dates[Date], "mmmm")
NumMois = MONTH(Dates[Date]) // sert à trier Mois
Trimestre = "T" & QUARTER(Dates[Date])
→ relier Dates[Date] à Ventes[Date], puis Marquer comme table de dates.
Lecture : « T » & QUARTER(Dates[Date]) concatène « T » et le numéro de trimestre (T1, T2…).
Leçon : NumMois existe uniquement pour trier Mois correctement dans les visuels.
Vocabulaire de la section
- Table de dates
- Dimension calendrier : une ligne par jour, continue sur la période, reliée à la date des faits — le socle temporel.
Exemple simple : Zineb crée la table Dates reliée à Ventes[Date].
Ce que ce n'est pas : des dates dispersées dans la table de faits, sans calendrier.
Réflexe : analyse temporelle → une table de dates dédiée.
- CALENDARAUTO / CALENDAR
- Les fonctions DAX qui génèrent le calendrier : CALENDARAUTO() balaie les dates du modèle ; CALENDAR(début; fin) les fixe.
Exemple simple : Zineb écrit Dates = CALENDARAUTO() pour commencer.
Ce que ce n'est pas : une liste de dates saisie à la main.
Réflexe : modèle propre → CALENDARAUTO ; bornes maîtrisées → CALENDAR.
- Marquer comme table de dates
- Le réglage officiel (outils de table) qui active le bon comportement des fonctions de time intelligence.
Exemple simple : Zineb marque Dates comme table de dates après l'avoir reliée.
Ce que ce n'est pas : une table de dates non marquée, ignorée par la time intelligence.
Réflexe : table de dates construite → la marquer officiellement.
- Hiérarchie
- Année → Trimestre → Mois → Jour : l'exploration par niveaux dans les visuels (boutons de drill).
Exemple simple : Zineb explore sa courbe d'année en mois par drill down.
Ce que ce n'est pas : un seul niveau plat, impossible à explorer.
Réflexe : rendre les visuels temporels explorables → hiérarchie.
- Tri par colonne
- On trie la colonne Mois (libellé) par la colonne NuméroMois (Outils de colonne → Trier par colonne).
Exemple simple : Zineb obtient janvier, février… et non avril, janvier.
Ce que ce n'est pas : un tri alphabétique des mois, faux.
Réflexe : mois affiché → le trier par son numéro.
En pratique — En pratique — Construire LE calendrier du modèle
- Nouvelle table (vue Table → Nouvelle table) : Dates = CALENDARAUTO(), comme Zineb.
- Ajoutez les colonnes : Année = YEAR(Dates[Date]) ; Mois = FORMAT(Dates[Date]; "mmmm") ; NumMois = MONTH(Dates[Date]) ; Trimestre = "T" & QUARTER(Dates[Date]).
- Triez Mois par NumMois (Outils de colonne → Trier par colonne), reliez Dates[Date] à Ventes[Date], puis Marquer comme table de dates.
- Créez la hiérarchie (clic droit sur Année → Nouvelle hiérarchie, ajoutez Trimestre, Mois) et utilisez-la dans votre courbe d'évolution : les boutons d'exploration apparaissent.
Script pas-à-pas — bâtir le calendrier comme Zineb (10 min)
1) Nouvelle table : Dates = CALENDARAUTO(). 2) Ajoutez Année = YEAR(Dates[Date]), Mois = FORMAT(Dates[Date], "mmmm"), NumMois = MONTH(Dates[Date]) et Trimestre = "T" & QUARTER(Dates[Date]). 3) Triez Mois par NumMois (Outils de colonne → Trier par colonne). 4) Reliez Dates[Date] à Ventes[Date], puis Marquer comme table de dates. 5) Créez la hiérarchie Année → Trimestre → Mois et testez le drill down dans une courbe. 6) Désactivez la hiérarchie de dates automatique dans Options.
Si des dates parasites (1900, dates de naissance) traînent dans le modèle, préférez CALENDAR(début; fin) à CALENDARAUTO().
Modèle copier-coller — mon calendrier DAX
Dates = CALENDARAUTO()
Année = YEAR(Dates[Date])
Mois = FORMAT(Dates[Date], "mmmm")
NumMois = MONTH(Dates[Date])
Trimestre = "T" & QUARTER(Dates[Date])
[ ] Trier Mois par NumMois [ ] Relier Dates[Date] → Ventes[Date]
[ ] Marquer comme table de dates [ ] Hiérarchie Année → Trimestre → Mois → Jour
Générer le calendrier
Zineb écrit Dates = CALENDARAUTO() : une ligne par jour couvrant les dates du modèle.
Trier les mois
Zineb trie Mois par NumMois : janvier, février, mars… et non avril, janvier.
Marquer la table
Zineb relie Dates aux ventes puis la Marque comme table de dates : la time intelligence s'active.
Explorer par hiérarchie
Zineb glisse la hiérarchie Année → Mois dans une courbe : le drill down révèle chaque niveau.
✓ Bonnes pratiques
- Créer une seule table de dates, continue et marquée officiellement.
- Trier les mois par une colonne numérique (« Trier par colonne »).
- Construire la hiérarchie Année → Mois pour rendre les visuels explorables.
✗ Pièges fréquents
- Se contenter de la hiérarchie de dates automatique (table cachée par colonne).
- Oublier de trier Mois par NumMois (ordre alphabétique erroné).
- Utiliser CALENDARAUTO avec des dates parasites (1900, naissance).
Points clés à retenir
- Une table de dates dédiée, continue, marquée officiellement : non négociable pour l'analyse temporelle.
- Le tri des mois passe par une colonne numérique : « Trier par colonne » est le réflexe.
- La hiérarchie Année → Mois rend chaque visuel temporel explorable (drill down).
- Une seule table de dates pour tout le modèle : toutes les analyses temporelles s'y branchent.
Défi 48h — appliquez demain
Bâtissez le calendrier de Zineb : créez Dates = CALENDARAUTO(), ajoutez Année/Mois/NumMois/Trimestre, triez Mois par NumMois, reliez Dates[Date] à Ventes[Date] et Marquez la table comme table de dates. Terminez par une hiérarchie Année → Mois testée dans une courbe.
- Je génère une table de dates (CALENDARAUTO ou CALENDAR).
- Je trie les mois par NumMois et je marque la table comme table de dates.
- Je construis une hiérarchie Année → Mois et j'explore en drill down.
Questions fréquentes
La hiérarchie de dates automatique de Power BI ne suffit-elle pas ?
Elle dépanne sur un petit fichier, mais crée une table de dates cachée par colonne de date (ce qui alourdit le fichier), et ne permet ni tri personnalisé des mois ni analyse temporelle propre. Les professionnels la désactivent (Options → Chargement des données → Date/heure automatique) au profit d'une table de dates dédiée, unique, qu'ils contrôlent entièrement.
CALENDARAUTO ou CALENDAR : lequel choisir ?
CALENDARAUTO() balaie toutes les dates présentes dans le modèle et génère un calendrier qui les couvre : pratique et sans réglage. CALENDAR(DATE(2024;1;1); DATE(2026;12;31)) fixe des bornes explicites. On préfère CALENDAR quand des dates parasites (une date de naissance, une valeur 1900) traînent dans le modèle : CALENDARAUTO générerait alors un calendrier immense et alourdirait le fichier.
Qu'exige la time intelligence (évolution, cumuls, N-1) ?