2.5 · Hiérarchies & table de dates (calendrier)

Niveau 2 · Modèle & DAX

2.5Hiérarchies & table de dates (calendrier)

Objectif : Construire un calendrier aux normes, relié et hiérarchisé — pour déverrouiller la time intelligence du niveau 3.
Temps estimé : 18 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

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.

Erreur d'interprétation fréquente : « La hiérarchie de dates automatique de Power BI suffit, l'ordre alphabétique des mois est acceptable, et je peux multiplier les tables de dates ». Non, triple erreur. L'automatique crée une table cachée par colonne de date et alourdit le fichier : les professionnels la désactivent au profit d'une table dédiée. « Avril » avant « janvier » fausse toute lecture : on trie Mois par NumMois. Et une seule table de dates doit servir tout le modèle.
La table de dates Générer, compléter, marquer : le socle temporel de l'analyse. Générer CALENDARAUTO() ouCALENDAR(début; fin)Compléter Année, Mois,NumMois, TrimestreMarquer Marquer commetable de dates
Générer, compléter, marquer : le socle temporel de l'analyse.
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Zineb, contrôleuse de gestion à Alger, construit le socle de son analyse temporelle : une table de dates dédiée, générée en DAX (CALENDARAUTO() ou CALENDAR(début; fin)), avec une ligne par jour, continue. 2) Elle la complète (Année, Mois, NumMois, Trimestre), trie la colonne Mois par NumMois — « avril » ne doit pas passer avant « janvier » — et relie Dates[Date] à Ventes[Date] avant de la Marquer comme table de dates. 3) Elle crée la hiérarchie Année → Trimestre → Mois → Jour, l'utilise dans sa courbe d'évolution (les boutons d'exploration apparaissent) et désactive la hiérarchie de dates automatique. Leçon : une seule table de dates, continue et marquée, déverrouille la time intelligence du niveau 3.

🔎 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

  1. Nouvelle table (vue Table → Nouvelle table) : Dates = CALENDARAUTO(), comme Zineb.
  2. Ajoutez les colonnes : Année = YEAR(Dates[Date]) ; Mois = FORMAT(Dates[Date]; "mmmm") ; NumMois = MONTH(Dates[Date]) ; Trimestre = "T" & QUARTER(Dates[Date]).
  3. Triez Mois par NumMois (Outils de colonne → Trier par colonne), reliez Dates[Date] à Ventes[Date], puis Marquer comme table de dates.
  4. 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.
Un calendrier aux normes, relié et hiérarchisé — la time intelligence du niveau 3 est déverrouillée.

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.

Checklist sortie de section
  • 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.
Auto-évaluation 1-5 : est-ce que je construis un calendrier complet sans oublier le tri ?Auto-évaluation 1-5 : ai-je relié et marqué ma table de dates ?

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.

Vérifiez votre compréhension

Qu'exige la time intelligence (évolution, cumuls, N-1) ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 2Questions inédites et durcies pour valider vos acquis