Relations et modélisation des données Power BI

Objectif pédagogique : Maîtriser la structuration des données et les relations entre tables pour des analyses fiables dans Power BI.

À la fin de ce chapitre, tu seras capable de…

  • Identifier les clés primaires et étrangères dans un modèle de données
  • Configurer les relations entre tables selon leur cardinalité
  • Utiliser Power Query pour analyser la distribution des colonnes
  • Optimiser la structure des données pour les visualisations
  • Implémenter la logique métier via des relations cohérentes

💡 Prérequis : Maîtrise de l’importation de données et de l’interface Power BI Desktop

Mise en contexte

Vous avez importé vos données dans Power BI, mais sans relations correctes entre vos tables Client et Commandes, vos analyses risquent d’être faussées. Tu vas apprendre à identifier les clés primaires comme l’ID_Client, à configurer des relations un-à-plusieurs fiables, et à utiliser les outils de profilage Power Query pour garantir l’intégrité de ton modèle de données.

INTRODUCTION

La modélisation des données est au cœur de toute analyse approfondie, quel que soit l’outil utilisé, et Power BI ne fait pas exception. Une fois que les données ont été importées ou intégrées dans le modèle de données Power BI, il est essentiel de structurer ces données de manière à refléter fidèlement les besoins métiers : définir et gérer les relations entre tables, implémenter la logique métier analytique et créer les calculs nécessaires pour permettre des visualisations précises et des décisions éclairées.

En pratique, cela implique :

  • Configurer et optimiser les relations entre les tables afin que les filtres et agrégations fonctionnent correctement à travers les visuels.
  • Créer des calculs analytiques via le langage DAX (Data Analysis Expressions), que ce soit sous forme de mesures, colonnes calculées ou tables calculées, pour traduire la logique métier.
  • Organiser les tables selon des schémas de modélisation efficaces (par exemple en étoile), afin de garantir performance, cohérence et évolutivité des rapports.
Une modélisation de qualité constitue la base sur laquelle reposent des analyses robustes : sans un modèle de données bien pensé, les visualisations ne peuvent pas refléter correctement la réalité métier, et les décideurs risquent de s’appuyer sur des résultats biaisés ou incomplets.

1. Relations dans la modélisation des données

Dans un modèle de données Power BI, les relations entre tables sont essentielles pour garantir que les calculs et les visualisations reflètent fidèlement les résultats métier. Une relation crée un lien logique entre des colonnes de deux tables afin que Power BI sache comment lier et filtrer les données lors de l’analyse ou de la création de rapports.

1.1 Types de relations

Quand on relie deux tables, la cardinalité de la relation dépend de la manière dont les enregistrements correspondent :

  • Un-à-un (1:1) : chaque ligne de la Table X correspond à une seule ligne de la Table Y, et vice-versa. Ce type de relation est rare mais utile lorsque les entités sont fortement couplées.
  • Un-à-plusieurs (1:*) : une ligne de la Table X peut correspondre à plusieurs lignes de la Table Y. C’est le type de relation le plus fréquent, par exemple lorsqu’un client possède plusieurs commandes.
  • Plusieurs-à-plusieurs (:) : les lignes de chaque table peuvent se relier à plusieurs lignes de l’autre table. Power BI prend en charge ce type de relation pour des scénarios avancés à l’aide de tables de pont ou de cardinalité spéciale.

1.2 Identifier les colonnes clés pour les relations

Avant de créer une relation, il faut identifier les colonnes clés dans chaque table :

1.2.1 Clé primaire (Primary Key)

Une clé primaire est une colonne dont les valeurs identifient de manière unique chaque ligne d’une table. Dans un modèle Power BI, chaque relation doit reposer sur une colonne unique du côté « un » afin d’assurer l’intégrité du modèle. Les clés composites (plusieurs colonnes combinées) ne sont pas prises en charge nativement par le modèle de données et doivent être transformées en une colonne unique avant création de la relation.
Dans les systèmes relationnels (SQL Server, Oracle…), les colonnes contenant ID, Key ou Code sont souvent déjà des clés primaires. Cependant, dans d’autres cas, il peut être nécessaire d’identifier manuellement la colonne la plus distincte ou la plus significative pour établir une relation correcte.

1.2.2 Procédure pour repérer une clé primaire candidate avec Power Query

1

Si l’Éditeur Power Query est fermé, dans Power BI Desktop, allez dans Accueil > Transformer les données pour l’ouvrir.

2

Ouvrez l’onglet Affichage et activez Distribution des colonnes (outils de profilage). Un encart apparaît au-dessus de chaque colonne.

3

Survolez les encarts de distribution pour consulter les % de valeurs distinctes et % de valeurs uniques ; ciblez la colonne avec le plus haut taux d’unicité comme candidate à la clé primaire (ex. id_client pour DimClient).

La figure ci-dessous montre comment identifier une clé primaire candidate dans Power Query à l’aide de la fonctionnalité Distribution des colonnes (profilage des données).

 

Figure 1: Identification d’une clé primaire à l’aide de la fonctionnalité Distribution des colonnes dans Power Query

1.2.3 Notes importantes

  • Une table n’est pas obligée d’avoir une clé primaire formelle, mais pour des relations fiables et des agrégations correctes, il est fortement recommandé de disposer d’une colonne unique identifiée comme telle.
  • Les relations permettent à Power BI de propager des filtres d’une table à l’autre, ce qui est crucial pour des calculs analytiques précis dans vos visuels.
  • En l’absence de clé unique valide, Power BI peut créer une relation avec une cardinalité inattendue, ou vous demander d’ajuster vos données avant de la définir.
  • Pour rendre les informations de Distribution des colonnes plus précises, il faut modifier le profilage des colonnes pour qu’il soit calculé sur l’ensemble du jeu de données, comme illustré à la figure 2. Sélectionnez cette option en cliquant sur le pied de page (barre d’état).

 

Figure 2: Profilage de colonne sur l’ensemble du jeu de données (via le pied de page)

1.2.4 Clé étrangère (Foreign Key)

Une clé étrangère est une colonne d’une table qui référence la clé primaire d’une autre table afin d’établir une relation logique entre les deux tables dans le modèle de données.
Dans un modèle Power BI, la clé étrangère se situe généralement du côté « plusieurs » (souvent la table de faits) : elle peut contenir des valeurs en doublon correspondant à plusieurs enregistrements liés à une même entité dans la table de dimension.
Power BI crée des relations entre une seule colonne par table et exige que les colonnes utilisées pour la relation aient un type de données identique ou compatible. Si la logique métier repose sur une clé composite (plusieurs colonnes), il faut d’abord créer une clé concaténée unique dans chaque table avant de définir la relation. Une fois la relation établie, elle permet la propagation correcte des filtres et la cohérence des agrégations et des calculs analytiques à travers les tables du modèle.
Cette figure montre la vue du modèle qui permet de créer les relations:

Figure 3: Vue du modèle pour créer les relations

2. Les relations dans Power BI

Créer des relations fiables (cardinalité, direction du filtrage croisé, relation active) pour garantir des résultats exacts dans les visuels. Au moins une colonne doit être unique côté «1».

Figure 4: Relation un-plusieurs (1:*) entre la table clients et la table factures

À partir de nos tables, nous pouvons créer d’autres relations :

  • DimClients (clé : id_client) → factures (FK : id_client) (1:*)
  • DimClients → reservations (FK : id_client) (1:*)
  • agences (clé : id_agence) → vehicules (FK : id_agence_proprietaire) (1:*)
  • comptes (clé : id_compte) → ecriture_comptables (FK : id_compte) (1:*)
  • Etc…

Configurez les relations dans Modélisation > Gérer les relations et vérifiez la cardinalité et la direction (sens unique vs sens double). La figure ci-dessous illustre la création de relations entre les différentes tables.

Figure 5: Création de relations entre les tables

Les relations dans Power BI relient une seule colonne de chaque côté, et la propagation des filtres suit le graphe relationnel. Privilégiez un schéma en étoile (dimensions vers les tables de faits).

3. DAX pour analyses

3.1 Tables calculées

Dans certains cas, vous devez ajouter de nouvelles tables basées sur des données déjà chargées dans le modèle. Ces tables peuvent être créées à l’aide de DAX.

Vous pouvez également utiliser un constructeur de table en DAX pour créer une table calculée. Le constructeur de table n’est pas une fonction ; il s’agit d’un ensemble de caractères permettant de créer une table en DAX. Par exemple, l’expression DAX suivante crée une table avec une seule colonne comme le montre la Figure 6 ci-dessous.

Calculated Table 1 = {"A", "B", "C"}

 

Figure 6: Création d’une table calculée à une seule colonne à partir du constructeur de table

Vous pouvez utiliser des accolades {} pour construire une table. Il s’agit d’une forme simple d’utilisation du constructeur de table en DAX. Voici comment cela fonctionne :

  • Début du constructeur de table : ouvrez une accolade {
  • « A », « B » et « C » sont les valeurs d’une seule colonne
  • Fin du constructeur de table : fermez l’accolade } »

En DAX, cette syntaxe génère une table calculée contenant une colonne unique appelée Valeur (Value) si une seule expression est indiquée.

Vous pouvez utiliser n’importe quelle expression DAX scalaire comme valeur. L’exemple ci-dessous crée une autre table calculée en utilisant le constructeur de table ainsi que la fonction DATE().

Une expression scalaire en DAX correspond à une expression qui retourne une valeur unique (texte, nombre, date, booléen, etc.), ce qui est requis pour alimenter les valeurs d’un constructeur de table.

Calculated Table 2 =

{DATE(2020, 7, 22), DATE(2020, 7, 23), DATE(2020, 8, 2)}

La figure 7 montre les résultats de l’exécution de l’expression DAX ci-dessus :

 

 

Figure 7: Création d’une table calculée à l’aide du constructeur de table DAX en utilisant la fonction DATE()

L’expression DAX suivante constitue une autre forme du constructeur de table : lorsque vous définissez des lignes d’enregistrements à l’aide de parenthèses (), les valeurs étant séparées par des virgules. Comme illustré dans la figure 8, vous pouvez utiliser des valeurs constantes ou des expressions scalaires pour définir les lignes.

CalculatedTable3 =

{

( « A », 1.5, DATE(2017, 1, 1), CURRENCY(199.99) ),

( « B », 2.5, DATE(2017, 1, 2), CURRENCY(249.99) ),

( « C », 3.5, DATE(2017, 1, 3), CURRENCY(299.99) )

}

 

Figure 8: Création d’une table calculée via les constructeurs DAX utilisant des valeurs constantes ou des expressions scalaires.

Comme indiqué précédemment, lors de la définition des lignes au sein du constructeur de table, les noms de colonnes par défaut sont attribués sous la forme Value1, Value2, Value3, etc… Nous avons également précisé qu’il est possible d’utiliser toute fonction DAX retournant une table comme les fonctions itératives. Les cas d’usage sont nombreux. Par exemple, si vous souhaitez créer une table calculée affichant :

  • Le nom complet des clients, obtenu par la concaténation de leur prénom et de leur nom.
  • Leur montant total de ventes.
  • Le tout, filtré sur la région Australie.
💡 À retenir : Créer une nouvelle table calculée dans Power BI en utilisant des fonctions DAX itératives (c’est-à-dire des fonctions qui évaluent une expression ligne par ligne ou regroupent des données), afin de générer une table synthétisée à partir d’une table source existante.
👉 Pour créer une table calculée, cliquez sur le bouton « Nouvelle table » sous l’onglet Modélisation du ruban (assurez-vous que la vue « Affichage du rapport » est bien sélectionnée dans le volet de gauche). Saisissez ensuite l’expression DAX suivante dans la barre de formule. Ces étapes sont illustrées par la Figure 9 :

Australian Customers Sales =

SUMMARIZECOLUMNS (

DimCustomer[CustomerKey]

, FILTER(

VALUES(DimGeography[EnglishCountryRegionName])

, DimGeography[EnglishCountryRegionName] = « Australia »)

, « Customer Full Name », CONCATENATEX(DimCustomer, DimCustomer[FirstName] &  »  » & DimCustomer[LastName])

, « Sales Amount », SUM(FactInternetSales[SalesAmount])

)

Figure 9: Création d’une table calculée DAX via l’onglet modélisation.

Les tables calculées se recalculent lors du refresh des tables sources et peuvent participer aux relations.

3.2 Colonnes calculées (Calculated Columns)

Une colonne calculée est une nouvelle colonne ajoutée au modèle de données à l’aide d’une formule DAX (Data Analysis Expressions). Contrairement aux mesures, une colonne calculée est évaluée ligne par ligne au moment de l’actualisation des données et stockée dans le modèle pour être utilisée comme tout autre champ dans les visuels.

3.2.1 Caractéristiques principales

  • Les colonnes calculées étendent une table existante en ajoutant des valeurs dérivées de données existantes.
  • Elles sont statiques à l’exécution: leurs valeurs ne changent pas en fonction des interactions de l’utilisateur dans le rapport.
  • Elles sont calculées à l’actualisation des données et stockées dans le modèle, ce qui peut augmenter la taille du modèle et impacter les performances si elles sont utilisées sans nécessité.
  • Elles peuvent être utilisées dans des segments, des filtres, des lignes ou des colonnes d’un visuel, car elles produisent un champ réel du modèle à chaque ligne.

3.2.2 Quand créer une colonne calculée ?

Créez une colonne calculée uniquement si :
  • Vous avez besoin d’une colonne dérivée qui doit être présente au niveau des lignes, par exemple pour segmentation, tri ou regroupement dans un visuel.
  • Vous souhaitez exploiter les relations du modèle pour obtenir des valeurs qui ne sont pas disponibles directement dans la source.
💡 À retenir : Sinon, privilégiez les mesures DAX (calculées à la demande et non stockées dans le modèle) ou effectuez la transformation en amont dans Power Query si possible, afin de limiter la charge sur le modèle et préserver les performances.

3.2.3 Créer une colonne calculée dans Power BI Desktop

Vous pouvez créer une colonne calculée soit depuis la vue Rapport, soit depuis la vue Données :
1

Cliquez avec le bouton droit (clic droit) sur une table dans le volet Champs, puis sélectionnez Nouvelle colonne.

2

Sélectionnez une table, puis cliquez sur Nouvelle colonne dans l’onglet Outils de table, cliquez sur Nouvelle colonne.

3

Sélectionnez une table dans le volet Champs, puis, dans l’onglet Modélisation, cliquez sur Nouvelle colonne.

La figure 10 illustre comment créer une colonne calculée à partir de la vue Rapport.

Figure 10: Création de colonnes calculées

En résumé, une colonne calculée est utile pour dériver de nouvelles données au niveau ligne qui doivent être disponibles dans l’axe, segment ou filtre d’un visuel. Toutefois, il est recommandé de limiter leur utilisation lorsqu’un calcul dynamique au niveau agrégé peut être accompli plus efficacement par une mesure DAX ou par une transformation en Power Query.

Exercice : Ajout d’une colonne calculée année-mois

AnneeMois = FORMAT ( factures[DateFacture], "YYYY-MM" )

3.3 Mesures

Les mesures sont généralement des calculs analytiques : sommes, moyennes, minima, maxima, décomptes, etc. Vous pouvez utiliser ces mesures au sein des visuels Power BI. Le résultat d’une mesure est dynamique : il varie selon les interactions et le contexte de chaque visuel. Tout comme pour les colonnes calculées, vous disposez de plusieurs méthodes pour créer une mesure, que ce soit depuis l’affichage du rapport ou l’affichage table(la vue Données). Voici la procédure pour créer une mesure.

A

Faites un clic droit sur une table dans le volet Données et sélectionnez Nouvelle mesure.

B

Sélectionnez une table dans le volet Données et choisissez « Nouvelle mesure » sous l’onglet Outils de table.

C

Sélectionnez une table dans le volet Données et choisissez Nouvelle mesure sous l’onglet Modélisation.

Figure 11: Création de mesures dans Power BI

Dans certains cas, la création de calculs analytiques ne se limite pas à une simple somme. Il est souvent nécessaire de définir d’autres mesures pour répondre aux exigences métier, certaines pouvant être plus complexes. Power BI facilite grandement la mise en œuvre de ces calculs grâce aux Mesures rapides (Quick Measures), que vous découvrirez plus en détail dans la partie suivante :

3.4 Mesures rapides

La procédure est la même que celle de calcul de mesure :

A

Faites un clic droit sur une table dans le volet Données et sélectionnez Nouvelle mesure rapide.

B

Sélectionnez une table dans le volet Données et choisissez Nouvelle mesure rapide sous l’onglet Outils de table.

C

Sélectionnez une table dans le volet Données et choisissez Nouvelle mesure rapide sous l’onglet Modélisation.

Les Mesures rapides permettent de générer automatiquement des formules DAX pour des calculs courants (totaux cumulés, pourcentages, variations, etc.), facilitant ainsi la prise en main pour les utilisateurs débutants tout en accélérant le développement analytique.

3.5 Time Intelligence dans Power BI

Pourquoi l’intelligence temporelle est-elle indispensable ?

Imaginez la situation suivante :

Votre tableau de bord affiche un chiffre d’affaires de 50 000 € ce mois-ci.

Est-ce une bonne performance ?

Impossible à dire sans contexte temporel :

  • Par rapport au mois précédent ?
  • Par rapport à la même période l’an dernier ?
  • Par rapport à un objectif ou à une tendance ?

Un chiffre seul n’a pas de sens métier sans le facteur temps.

3.5.1 Définition

La Time Intelligence (intelligence temporelle) désigne un ensemble de fonctions DAX permettant d’analyser les données dans le temps, notamment pour :

  • des calculs de cumul (Month-To-Date, Year-To-Date),
  • des comparaisons temporelles (même période l’année précédente),
  • des analyses d’évolution (mois sur mois, année sur année).

3.5.2 Objectif métier

La Time Intelligence permet de répondre à des questions essentielles pour le pilotage :

  • Sommes-nous en croissance ?
  • Quelle est la tendance globale de notre activité ?
  • La performance s’améliore-t-elle ou se dégrade-t-elle ?
  • Avons-nous atteint nos objectifs dans le temps ?

Les fonctions de Time Intelligence ne fonctionnent correctement que si une table de dates valide est utilisée dans le modèle.

Sans table de dates conforme :

  • les résultats peuvent être incorrects,
  • les comparaisons temporelles deviennent peu fiables,
  • certaines fonctions DAX peuvent mal se comporter sans erreur visible.

3.6 La Table de Dates

Une table de dates est une table de dimension qui contient :

  • une ligne par jour, sans interruption,
  • des attributs calendaires tels que :
    • Année
    • Trimestre
    • Mois
    • Jour
    • Numéro de semaine

Elle constitue la référence temporelle centrale du modèle Power BI.

Pourquoi est-elle indispensable ?

Les fonctions de Time Intelligence nécessitent une table de dates valide pour fonctionner correctement.

Rôle de la table de dates dans le modèle

La table de dates permet :

  • d’assurer une continuité temporelle parfaite (aucun jour manquant),
  • de partager une chronologie unique entre plusieurs tables de faits,
  • d’activer correctement et de fiabiliser les calculs DAX temporels.

Utilisation directe de colonnes de dates présentes dans les tables de faits n’est pas recommandée comme bonne pratique car:

Ces colonnes :

  • contiennent souvent des dates manquantes,
  • ne couvrent pas toutes les périodes,
  • ne sont pas adaptées aux fonctions de Time Intelligence.

Bonne pratique recommandée

👉

Créer et utiliser une table de dates dédiée, unique, continue et reliée au modèle.

💡 À retenir :

La table de dates est le socle de toute analyse temporelle fiable dans Power BI.

3.7 La fonctionnalité Auto Date/Time dans Power BI

La fonctionnalité Date/heure automatique (Auto Date/Time) est activée par défaut dans Power BI Desktop.

Lorsqu’elle est active, Power BI :

  • crée automatiquement une table de dates cachée pour chaque colonne de type Date,
  • génère une hiérarchie temporelle : Année → Trimestre → Mois → Jour.

Avantages

  • Très simple à utiliser
  • Aucune configuration nécessaire
  • Idéal pour découvrir Power BI ou faire des analyses rapides

Limites (point très important)

  • Une table cachée par colonne de date impacte négativement le modèle: modèle plus lourd
  • Peu ou pas de personnalisation possible :
    • calendrier fiscal
    • jours fériés
    • règles métier spécifiques
  • Non adapté aux modèles professionnels ou industriels

💡 À retenir :

Auto Date/Time est pratique pour apprendre, mais insuffisant pour piloter un business.

Procédure : Activer / Désactiver Auto Date/Time

1

FichierOptions et paramètresOptions

2

Section Chargement des données

3

Activer ou désactiver Date/heure automatique

3.8 Générer une table de dates dans Power BI Desktop

Microsoft recommande explicitement de créer une table de dates dédiée.

Deux méthodes principales sont recommandées :

3.8.1 Créer une table de dates avec Power Query (langage M)

Pourquoi utiliser Power Query ?
  • Transformation en amont du modèle
  • Excellentes performances
  • Table réutilisable et standardisable
Procédure simplifiée
1

AccueilTransformer les données

2

AccueilNouvelle sourceRequête vide

3

Ouvrir l’Éditeur avancé

4

Générer une liste de dates avec List.Dates

5

Convertir la liste en table

6

Ajouter les colonnes calendaires (Année, Mois, Trimestre…)

7

Fermer et appliquer

💡 Exercice :

L’objectif de cet exercice est de comprendre la logique de construction d’une table de dates, étape par étape, à partir d’un script existant. Vous disposez d’un script Power Query (langage M) complet, prêt pour une exploitation métier. En analysant le code, identifiez clairement :

  • la définition du périmètre temporel,
  • la génération de la liste de dates,
  • la transformation de la liste en table,
  • l’application du type de données approprié,
  • l’ajout des principales colonnes calendaires.

Pour chaque bloc, expliquez ce qu’il fait et pourquoi il est nécessaire dans un modèle Power BI professionnel.

Voici le script M :

let
 DateDebut = #date(2020, 1, 1),
 DateFin = #date(2025, 12, 31),
 ListeDates =
 List.Dates(
 DateDebut,
 Duration.Days(DateFin - DateDebut) + 1,
 #duration(1, 0, 0, 0)
 ),
 TableDates =
 Table.FromList(
 ListeDates,
 Splitter.SplitByNothing