Gérer plusieurs relations entre deux tables dans Power BI
Feb 05, 2024Dans un modèle de données traditionnel, la relation entre deux tables est définie par un seul lien 1...1, 1...N, etc. Dans certains outils de datavisualisation, il est possible d'activer et de désactiver ces relations en fonction du chemin emprunté dans le modèle pour parcourir les tables. Cette technique est utilisée à la fois pour améliorer les performances des requêtes et pour trouver des solutions de modélisation, notamment pour éviter les boucles. Dans Power BI, ce concept d'activation/désactivation d'un lien entre deux tables est présent, et il est même possible de créer plusieurs relations entre ces deux tables. Cet article expliquera comment et pourquoi créer plusieurs liens entre deux tables autour d'un cas concret, ainsi qu'un exemple de désactivation de lien pour résoudre une problématique de modélisation.
Exemple dans le domaine des commandes
Il est courant de retrouver plusieurs dates dans une table de faits, les champs de type "date" étant habituellement utilisés comme clés de jointure avec la dimension temps. Dans notre exemple, nous utilisons une table de faits relative aux commandes clients. Une commande est associée à plusieurs informations telles que la date de commande et la date de livraison. La gestion des commandes commence au moment où le client passe une commande et se termine à la livraison, lorsque le produit est reçu. Le visuel ci-dessous représente le nombre de commandes et de livraisons ventilés en fonction de la dimension commune Temps, offrant ainsi un aperçu de l'ensemble du processus.
Les nombres de commandes et de livraisons sont utilisés pour calculer des indicateurs clés de performance en gestion logistique, tels que le taux de rupture de stock ou le taux de livraison complète et à temps. Il est donc important de pouvoir les croiser avec d'autres colonnes, comme celles issues d'une table de stock.
Créer une table de dates
Certaines fonctions en DAX permettent de le faire, comme MERGE() ou CALENDAR(). La fonction CALENDAR() créée un tableau avec l'intervalle de dates spécifié dans une nouvelle table. Pour accéder à cette fonctionnalité de création de table via DAX, cliquez sur Modélisation/Nouvelle table. La barre de formule DAX apparait : vous pouvez écrire l’expression suivante qui générera un tableau à une seule colonne contenant une ligne pour chaque date entre le 1er janvier 2023 et le 31 décembre 2024 :
Date = CALENDAR(DATE(2023;1;1); DATE(2024;12;31))
Il est possible d'ajouter d'autres colonnes pour inclure des colonnes calculées supplémentaires au tableau, telles que le mois, l'année ou l'année-mois, avec la fonction ADDCOLUMNS(), comme dans la formule ci-dessous :
Table = ADDCOLUMNS ( CALENDAR (DATE(2023;1;1); DATE(2024;12;31)), "Year", YEAR ( [Date] ) )
Créer les liens, les formules DAX et le visuel
Pour regrouper les données détaillées par un élément tel qu'une date, vous pouvez créer des mesures qui résument le nombre de lignes dans la table de dates. Il est possible de créer plusieurs relations entre ces deux tables comme dans notre cas où il y a 2 dates : la date de commande et celle de livraison. Si un champ d'une table est lié à plusieurs champs dans une autre table, une hiérarchie est établie. Par défaut, la première relation est utilisée et s'affiche dans la vue modèle avec une ligne continue. Toute relation ajoutée après celle-ci sera représentée par une ligne discontinue.
Vous pouvez forcer l'utilisation d'une relation secondaire avec la fonction USERELATIONSHIP() comme dans le formule suivante:
Nombre de commandes = COUNT(orders[Product_id])
Nombre de livraisons = CALCULATE(COUNT(orders[Product_id]),USERELATIONSHIP(orders[Shipment_date],'Table'[Date]))
Autre cas d'utilisation et alternatives aux relations actives/inactives
Lorsque le modèle de données devient complexe avec l'augmentation des chemins et des cas d'usage métier entre les différentes tables, il est fréquent de rencontrer des erreurs de dépendance circulaires. Ces erreurs sont liées à la définition du sens des liens entre les tables : unidirectionnel ou bidirectionnel. Elles peuvent être résolues en désactivant un lien. Il est également possible de créer des colonnes contenant de telles informations, en utilisant la fonction RELATED() pour activer la relation principale et récupérer l'information de la colonne, ou encore LOOKUPVALUE() pour activer des relations secondaires, comme dans les formules ci-dessous :
Date de commande = RELATED('Table'[Date])
Date de livraison = LOOKUPVALUE( 'Table'[Date], 'Table'[Date], orders[Shipment_date] )
En conclusion, la possibilité de créer plusieurs relations entre deux tables dans Power BI facilite le croisement d’informations dans le modèle. Cette approche appliquée pour la gestion des commandes montre l’importance de comprendre et de maîtriser les concepts de modélisation pour créer les KPIs en DAX et les visualiser.