Blog ENI : Toute la veille numérique !
🎃 Jusqu'à -30% sur les livres en ligne, vidéos et e-formations.
Code : GHOST30.
Cliquez ici !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

Modéliser les données et créer les mesures

Améliorer son modèle de données

Il est obligatoire de créer un modèle sémantique de données pour créer tout rapport : ce sera le jeu de données attaché automatiquement à votre datamart, avec ses tables, ses mesures et ses relations. Il sera mis à jour sans intervention du concepteur de rapport (cf. chapitre Maintenir un datamart, sections Actualiser un datamart en global et Actualiser les données en incrémentiel).

Les problèmes potentiels que les créateurs de rapports risquent de rencontrer lorsqu’ils voudront réaliser des visuels rapidement et sans anomalie sont :

  • une complexité et un volume de tables anormaux ;

  • des tables de fait et de dimension peu claires et éparpillées ;

  • des informations incohérentes ;

  • des formats de données non compatibles avec les mesures et les visuels choisis. 

Vous avez vu au chapitre Initialiser votre datamart, que plusieurs types de structures de modèles existent (en étoile, en flocon ou en synapse), et qu’il est souvent plus efficace d’opter pour un modèle de données en étoile pour éviter ces problèmes.

Si vos données sont en flocons ou en synapse, comme cela arrive le plus souvent, voici les étapes concrètes pour vous diriger vers un modèle en étoile.

1. Mesurer...

Marquer la table de dates

Une table de dates est une table dédiée qui contient un unique enregistrement pour chaque jour et couvre une période donnée entre deux dates. Cette table peut inclure tout attribut utile à l’utilisateur : l’année, le mois, la semaine, le numéro de semaine européen ou le fait que le jour soit férié ou pas.

Il faut toujours marquer la table Dimension temps comme table de dates pour éviter à Power BI Service de créer des tables de temps cachées, et obtenir que les visuels fonctionnent sur les dates.

Pour marquer une table de dimension temps comme table de dates, suivez ces instructions :

 Allez dans le datamart depuis l’espace de travail.

 Allez sur la vue Modèle en bas de la page.

images/Ch4-4.png

Pour faire au plus vite, lorsqu’il y a beaucoup de tables :

 Allez à la vue Modèle et cliquez dans l’onglet + (Nouvelle Disposition).

 Enregistrez la disposition temporairement sous le nom de votre choix (ici DispositionTemporaire).

 Glissez-déplacez la dimension temps dans la nouvelle disposition.

images/Ch4-500.png

 Effectuez un clic droit sur le nom de la table Dim_Temps.

 Cliquez sur Marquer comme table de dates.

images/Ch4-501.png

 Dans la liste déroulante Colonne de date, sélectionnez la colonne qui correspond à la date complète : ici le champ Date.

images/Ch4-6.png

Un message précise :...

Formater et renommer les colonnes du modèle sémantique

Comme nous l’avons vu au chapitre Power Query Online, section Ajout de table en dur en interface graphique, le formatage des colonnes, notamment Pourcentage, doit être finalisé dans le modèle de données. Ainsi, le modèle sémantique de données sera correct et exploitable pour le reporting, avec les bons formats (pourcentage, par exemple).

Voici le mode opératoire :

 Ouvrez le datamart.

 Allez dans Vue Modèle depuis le ruban rapide des vues, tout en bas.

 Cliquez ensuite sur + Nouvelle Disposition.

 Déplacez la table qui vous intéresse ici. Par exemple, retrouvez la table ScenarioInflation créée dans le datamart 6.Finances.

 Faites un glisser-déposer de la table dans cette disposition.

 Sélectionnez chaque champ et choisissez le Format de pourcentage.

images/Ch3-31.png

Nous voyons la distinction entre un type (notion liée au stockage et à VertiPaq, le moteur de compression de Power BI) et un format (notion liée au modèle de données et donc aux restitutions dans les rapports).

Créer les relations

Les relations dans un modèle de données propagent des filtres pour exécuter les calculs relatifs à des critères et des faits constatés.

1. Analyse dimensionnelle

La modélisation dimensionnelle des données va permettre de structurer les données en axes d’analyse et en « faits » (mesures quantitatives ou financières). Dès lors, les rafraîchissements des données se feront dans une logique naturelle et rapide, car les faits évoluent beaucoup, mais les dimensions restent stables, ce qui permet de constater des évolutions ou des tendances.

Les dimensions les plus utilisées sont le temps, les projets, les produits, les entités de personnes ou d’objets.

Une analyse quantitative filtrée par des critères s’appelle une analyse dimensionnelle. C’est, par exemple, la moyenne des ventes du dernier trimestre ou encore la somme des immobilisations du semestre.

Pour que cela fonctionne sans effet de bord, il faut une relation et de Un (1) à plusieurs (*) entre les différentes tables de dimensions et la table de fait. La flèche montre le sens de filtrage, qui est mono directionnel.

Voyez le cas pratique de la base de ventes de livres. Ici, notre table de fait est la table Fait_Commandes, avec l’ensemble des lignes de commandes sur plusieurs années, contenue dans la base Livres, issue de la fusion opérée au chapitre Power Query Online entre la table de Commandes et la table de Détail des Commandes.

La table des Clients représente la liste des clients et de leur département actuel. Cette table est directement présente dans la base Livres. La liste est dotée d’un numéro unique de client : si le client change de département, le numéro client n’est pas doublonné, l’ancien département n’est pas conservé.

images/Ch4-46.png

Un client achète plusieurs fois au fil du temps, il faut donc appliquer la cardinalité Un à Plusieurs. Un livre mène à plusieurs lignes de commandes. Idem pour le vendeur, qui peut vendre plusieurs livres au fur et à mesure des commandes.

Voici le mode opératoire pour établir les relations entre tables de dimensions et de faits.

Dans l’exemple...

Dénormaliser les tables

Pour bien réussir les analyses de dimension à dimension, par exemple compter le nombre de catégories par auteur ou l’inverse, vous pouvez intégrer les catégories directement dans la table des livres : nous appelons cela « dénormaliser » les tables.

En clair, nous ajoutons les catégories dans la table Livres et nous masquons la table des Catégories et des images de catégories du modèle : il n’y a plus qu’une dimension du côté livre, ce qui fait sens et simplifie le modèle.

Les segments, que ce soit sur les noms des catégories ou sur le nom des livres, fonctionnent parfaitement : même si la colonne NomCatégorie de la table Livres contient plusieurs catégories identiques, et la colonne Auteur contient des noms qui se répètent, le segment ciblé sur la colonne Catégorie ou Auteur de la nouvelle table Livres ne retient que les noms sans faire aucun doublon.

images/Ch4-50.png

Avec cette démarche, vous quittez les normes des bases de données qui cherchent à limiter l’espace disque, pour aller vers un principe de BI avec Schéma en étoile strict (sans dimension ni sous-dimension en cascade).

L’avantage est triple : il y a moins de tables à gérer, les analyses interdimension sont facilitées, les formules...

Définition du DAX

DAX a été créé en 2009 et est apparu la première fois dans Power Pivot pour Excel. Dax - Data Analysis Expressions - est un langage de formules pour Power BI et Excel destiné à opérer des calculs appelés Mesures.

Dans un datamart, une formule DAX retourne une valeur ou une table, mais retourner une table est possible uniquement en tant que production temporaire comme nous le verrons dans la sectionSpécificités du DAX de datamart.

Le DAX permet de créer ces « mesures » dans le modèle de données depuis des données déjà existantes.

En matière de prérequis, les tables à utiliser doivent impérativement être chargées par Power Query à la fin de son processus et d’autre part il faut que le modèle de données soit prêt et, si possible, doté de relations entre tables.

Bien qu’une mesure puisse faire appel à une autre mesure sans problème, pour éviter un temps d’attente sur les visuels, il faut limiter le nombre de niveaux d’empilage de mesures qui appellent des mesures et préférer des variables à l’intérieur de votre formule DAX : vous conservez en mesure uniquement ce qui est utile directement à l’utilisateur.

Spécificités du DAX de datamart

La différence la plus importante avec le DAX de Power BI Desktop est l’incapacité structurelle de créer une table de datamart en DAX, ce qui explique notre section sur la dimension temps dans Power Query Online.

La fonction GENERATESERIES, par exemple, ne peut pas exposer une liste de 1 à n qui aurait permis à l’utilisateur de faire ultérieurement un choix sur cette liste. Vous préparerez cette liste TopN dans Power Query Online, comme indiqué au chapitre Power Query Online, section Ajouter une série de 1 à 20 pour un choix du Top N.

Cette différence n’empêche absolument pas DAX d’utiliser des fonctions de table à l’intérieur d’une formule, comme CROSSFILTER ou SUMMARIZE, sous forme d’une variable ou d’une sous-partie de fonction. Simplement, la formule ne doit pas retourner au final une table dans le datamart, ce ne peut être qu’une variable intermédiaire.

Les autres différences sont :

  • La création de colonnes en DAX n’est pas possible. C’est à Power Query de créer les nouvelles colonnes, ce qui évite de se poser la question de passer par DAX ou pas. DAX crée des mesures, mais jamais de colonnes, ce qui évite de court-circuiter la base de données sous-jacente au datamart.

  • Le datamart n’est...

DAX et les relations

Plusieurs fonctions DAX présentent un intérêt pour les relations de modèle. Chaque fonction est décrite brièvement dans la liste ci-dessous.

RELATED : récupère la valeur du côté « un » d’une relation. Elle est utile lors de l’implication de calculs à partir de différentes tables évaluées dans le contexte de ligne.

Voici un exemple de code (réf. DAX 4.2) qui utilise correctement cette fonction, pour calculer la somme des ventes en volume hors bande dessinée.

Qté Vendues Hors BD = SUMX (FILTER ('Détail des commandes',  
RELATED (Livres[Code catégorie]) <>"BD"), 'Détail des  
commandes'[Quantité]) 

RELATEDTABLE : récupère une table de lignes du côté « plusieurs » d’une relation, si elle existe. Ceci sert à faire par exemple des comptages dans la table de fait dans un contexte donné, comme un comptage de commandes de clients par vendeur et par année, par exemple. Voici le code DAX (réf. 4.3) qui effectue ce comptage avec succès :

NbreCommandesClients = COUNTROWS ( RELATEDTABLE ( 'Commandes' )) 

Cette mesure va compter les lignes de commandes (côté plusieurs), en face de chaque vendeur, sachant que le vendeur est relié aux commandes.

USERELATIONSHIP : permet à un calcul de réactiver temporairement une relation inactive. En voici un exemple (code réf. DAX 4.32) :

NbreTicketsOuverts = CALCULATE( 
[NbreTickets], 
USERELATIONSHIP (Tickets_Fr[OuvertPar],EMPLOYEE_role_FR[Employé(e)]) 

CROSSFILTER : modifie la direction de la relation qui existe dans le modèle. La fonction peut inverser le sens de la relation, ou bien l’ignorer, ou encore passer d’une relation monodirectionnelle à une relation bidirectionnelle. Ici, par exemple, nous avons réussi à établir une relation...

Documentation DAX

Voici quelques livres et sites sur le sujet et nos commentaires :

https://learn.microsoft.com/en-us/power-bi/transform-model/desktop-quickstart-learn-dax-basics

Fondamentaux de DAX fondés sur Power BI Desktop.

https://learn.microsoft.com/en-us/dax/

Site de référence officiel Microsoft du langage DAX, très complet, assez bien expliqué, mais manque parfois d’exemples concrets pertinents.

https://dax.guide/

Site de SQLBI offrant un moteur de recherche simple et puissant (prendre Power BI comme outil, ce qui suffit pour les datamarts), une explication approfondie et des exemples bien utiles.

Le langage DAX de André Meyer-Roussillon aux Éditions ENI

Livre complet très bien expliqué avec des exercices de prise en main en français.

DAX patterns de Ferrari et Russo aux Éditions sqlbi (en anglais)

https://www.daxpatterns.com/

Livre américain fondé sur des exemples métier (finance, marketing) sans aucun égal sur le marché, mais parfois un peu complexe à comprendre.

Extreme DAX de Michiel Rozema et Henk Vlootman aux Éditions Packt

Livre didactique britanique d’explication sur DAX et la modélisation bien rédigé, en anglais et qui traite de nombreux exemples pratiques. On sent une pratique au quotidien dans ce livre. Un index très complet en fin de livre s’avère très précieux...

Ergonomie DAX Online

Écrire dans l’éditeur DAX Online du datamart permet de bénéficier de l’aide à la découverte des fonctions, des noms de tables, variables et mesures. Cette écriture offre moins de possibilités que DAX Studio, mais c’est de loin la solution la plus simple. Il n’y a pas besoin d’inclure une évaluation ou de définition au début du code comme dans DAX Studio.

1. Mode d’emploi de DAX

Pour utiliser DAX Online, il faut vous placer dans la section du bas Données ou Modèle du datamart et (si possible) sélectionner la table Mesures, que vous avez créée lors du chapitre Initialiser votre datamart - section Table des mesures en code M, afin que la mesure puisse s’y placer directement.

Ce choix de table Mesures fait sens, car une mesure est autonome et ne requiert donc aucun placement dans une table de fait ou de dimension. Si toutes les mesures sont regroupées dans cette table, leur usage est plus accessible. 

Une fois placé sur la table Mesures, l’éditeur DAX est accessible par un clic droit - Nouvelle mesure.

Une autre solution consiste à opérer une sélection de la table Mesure puis une activation du ruban Outils de table - Nouvelle mesure.

images/Ch4-62.png

Si vous utilisez le ruban Accueil - Nouvelle Mesure, la mesure sera créée sur la première table du datamart.

images/Ch4-1.png

Il reste à saisir ensuite...

Ergonomie DAX Studio

Dax Studio est un logiciel open source gratuit sous licence permissive Microsoft Reciprocal License (Ms-RL). Ce client riche de taille raisonnable (52 Mo) est sous Windows. Il est agréable et pratique. Il offre ces avantages :

  • ouvrir le modèle de données tabulaire des datamarts,

  • chercher les fonctions DAX classées par famille,

  • prévisualiser le résultat de formules DAX,

  • formater le code DAX de manière lisible,

  • recourir facilement au guide DAX,

  • tester les formules DAX avant de les délivrer aux utilisateurs,

  • mesurer la durée d’une requête en millisecondes.

L’outil est disponible en téléchargement gratuit à l’adresse : https://daxstudio.org

L’outil de formatage de DAX Studio s’appelle Format Query.

images/Ch4-37.png

Son formatage est riche : il sait formater la requête DAX avec des lignes courtes ou longues, détecter les erreurs de parenthèse ou de virgule et enfin enregistrer le fichier au format DAX. C’est l’outil qui a été utilisé pour formater et sauvegarder le code DAX de ce livre.

Voici une formule DAX non formatée :

Nb vendeurs = CALCULATE(DISTINCTCOUNT(Vendeurs[Numéro vendeur]),  
CROSSFILTER(Commandes[Numéro vendeur],Vendeurs[Numéro vendeur],Both)) 

Voici cette formule DAX formatée type long ou court. C’est beaucoup plus lisible  (code réf. DAX 4.30) :

Nb vendeurs = 
CALCULATE ( 
    DISTINCTCOUNT ( Vendeurs[Numéro vendeur] ), 
    CROSSFILTER ( Commandes[Numéro vendeur], Vendeurs[Numéro vendeur], BOTH ) 
) 

DAX Studio peut se connecter à votre datamart et fournir un retour sur vos formules DAX. Il offre également une aide à la syntaxe (branchée sur le guide DAX en ligne), un test d’exécution de formule DAX sans devoir passer par un rapport, une aide à la construction de requêtes simples et enfin des mesures de performance. Dans cet esprit de test, DAX studio peut aussi ajouter ou supprimer des commentaires pour tester certaines modifications sans détruire l’original, ou bien passer en majuscules...

Ergonomie ChatGPT

ChatGPT est co-financé par Microsoft. Et, bonne nouvelle, ChatGPT supporte les langages DAX et M. C’est une énorme avancée, en particulier pour les non experts en DAX. Cela va modifier totalement le rôle du Data Analyste, qui sera d’optimiser et de tester les formules plutôt que de les inventer depuis une feuille blanche. Si votre entreprise bloque ce site, pour éviter de fuiter des données, vous pourrez utiliser un compte personnel Microsoft ou Google.

ChatGPT propose un code DAX complété d’explications de son code et notamment des arguments à utiliser. À l’heure où sont écrites ces lignes, l’accès dispose d’un plan totalement gratuit, qui est disponible quand la demande est basse. L’accès gratuit offre une réponse rapide sur les créneaux horaires européens. Une version ChatGPT Plus est à 20 USD mensuels pour une meilleure disponibilité quand la demande est forte. Cette version n’est pas indispensable, mais elle offre encore plus de rapidité et un accès prioritaire aux nouveautés.

Sachez que si vous utilisez Copilot depuis le navigateur Microsoft Edge, vous obtiendrez une interface en français ainsi qu’exactement les mêmes réponses de Microsoft : cet outil utilise le même moteur d’Intelligence Artificielle que ChatGPT, tout en protégeant les données personnelles et celles de l’entreprise (selon l’éditeur).

On peut poser des questions en français, c’est tout aussi efficace qu’en anglais.

L’adresse internet à utiliser pour Power BI est :

Nom du site : ChatGPT | OpenAI

Adresse internet : https://chat.openai.com

L’interface est très simple et en anglais. Une fois authentifié avec un compte Microsoft ou Google, vous communiquez en bas dans Send a message. Il est bon de fournir le nom des champs, pour que le code soit rapide à adapter.

 Choisissez par exemple votre compte Microsoft et validez.

images/Ch4-33new.png

Voici pour votre information le contexte : vous êtes sur le datamart 5.Editions, le calendrier s’appelle Dim_Temps, la date s’appelle Date, et une formule fait déjà...

DAX au secours du modèle de données figé

Nous avons fait un modèle en étoile, avec des relations d’un à plusieurs entre les tables de dimension et celle de fait, et en prenant une relation à sens unique dimension vers table de fait.

images/Ch4-54new.png

Ce modèle et son sens unique sont pratiques pour les rapports sur les faits comme les ventes par pays et par vendeur. Il permet, comme nous l’avons vu précédemment, l’intégrité référentielle entre les dimensions et la table de fait. En clair, tout est carré, aucun fait ne se trouve orphelin. Cette intégrité référentielle évite les vides dans les segments ou les lignes incomplètes ou vides.

Quand nous recherchons le chiffre d’affaires par catégorie de livre par année, Power BI Service s’intéresse à chaque catégorie, critère qui descend dans la table Livres, et à chaque Année, ce qui descend dans la table Fait_Commandes le long du sens de filtrage (sur la flèche du diagramme ci-dessus) pour la filtrer correctement. La ligne Total (du bas) fait la somme des lignes sélectionnées.

CA € total = SUMX((Fait_Commandes , [Quantité]*[PV]) 

La référence de ce code est DAX 4.11.

images/Ch4-55.png

Cependant, quand on va analyser une dimension par rapport à une autre - par exemple le nombre d’ouvrages...

Les fonctions DAX de rang

Comme nous l’avons vu au chapitre Power Query Online sur la fonction M de rang, DAX est l’outil complet pour calculer le classement d’un ensemble de valeurs dans un modèle de données riche.

La syntaxe de la fonction DAX est la suivante :

RANKX ( <Table>, <Expression> [, <Valeur>] [, <Ordre ascendant>] [, <Densité de doublons>] )

RANKX retourne une valeur scalaire : un numéro d’ordre d’une expression (un classement des vendeurs en fonction des ventes par exemple).

Cette fonction est très sensible à l’intégrité référentielle : si vous l’avez désactivée par omission, ce n’est pas une bonne idée, car ceci vous ajoute des lignes vides dans les rangs.

Élément

Utilité

Table

Périmètre du classement, qui définit la liste des éléments à classer (sous forme de table).

Expression

Formule servant de base pour établir l’ordre ligne par ligne.

Valeur (optionnel)

Permet de créer une segmentation des articles, par plages de valeurs. Il s’agit de comparer un montant à une valeur déjà classée, comme par exemple classer des livres en segment des meilleures ventes, depuis une table de segment. La valeur est le montant à rechercher, parmi une liste déjà établie de montants préclassés présente dans l’expression (si c’est vide, l’Expression ci-dessus est utilisée).

Ordre ascendant (optionnel)

0 signifie Faux (à partir du bas par défaut), ou 1 pour vrai (ascendant, à partir du maximum).

Densité de doublons (optionnel)

Gère l’égalité de rang.

Skip saute le rang et ajoute la valeur + le nombre de valeurs à la place.

Skip (par défaut) signifie à faible densité ou numérotation, independant du nombre de doublons. Dans ce cas, s’il y a cinq doublons à partir du rang 2, le prochain rang sera 5+2=7, ce qui fait un classement très étendu : il saute les rangs de 3, 4, 5, 6.

Dense : Rang +1 si plusieurs égalités. Dans le cas précédent, le prochain rang sera 3, quel que soit le nombre de doublons.

Les classements par RANKX requièrent...

Les fonctions DAX de moyenne mobile

La moyenne mobile en DAX nécessite une réflexion préalable. Plusieurs formules sont possibles, mais apportent des résultats différents. Il faut donc les faire examiner auprès des consommateurs. Le choix de la formule va dépendre de la saisonnalité et de la distribution des valeurs (faits). Si on a des faits (ventes, achats, affectations…) très occasionnels, c’est-à-dire seulement à certains jours, les autres jours seront à zéro fait, a-t-on vraiment besoin d’une moyenne mobile fine ? Un lissage par semestre n’est-il pas suffisant ? S’il n’y a pas ou peu de faits certains jours, comme les week-ends et les jours fériés, ne doit-on pas annihiler ces jours dans la moyenne ? A-t-on des ventes sur la période antérieure ? Si ce n’est pas le cas, comment veut-on calculer la moyenne sur le tout début de l’année : la faire disparaître ? Ou réduire la moyenne sur deux mois au lieu de trois s’il n’y a pas de données précédentes ? Si on a des valeurs très régulières, comme un cours de bourse, ne doit-on pas plutôt raisonner en moyenne sur quelques jours (sept par exemple) ?

Voici une première formule DAX testée sur un datamart avec des valeurs quotidiennes, comme un cours de bourse, ou une consommation d’énergie.

Prenons le cours d’un indice boursier : par exemple l’EURO STOXX 50, qu’on peut télécharger sur marketwatch.com par exemple.

Si vous avez une licence Microsoft Fabric, vous aurez un accès OneLake très aisé depuis votre explorateur Windows. Le mode opératoire pour récupérer la donnée est expliqué au chapitre Power Query Online, section Importer un fichier depuis Microsoft Fabric OneLake.

À défaut, pour récupérer les sources Excel d’une certaine taille, il est recommandé de les importer dans une base de données. Le processus est expliqué au chapitre Power Query Online. L’expérience montre que la reprise depuis un répertoire OneDrive ou depuis SharePoint fonctionne, mais peut parfois générer des soucis d’authentification....

Fonction DAX conditionnelle

DAX a un avantage sur Power Query et son langage M : il dispose de fonctions conditionnelles multicritères, ce qui évite de passer par une série de IF qui s’emboîtent et qui rendent la formule rapidement illisible et difficile à déverminer.

Mais DAX a un inconvénient dans le cadre du datamart : le DAX du datamart ne peut pas créer de colonne calculée, mais uniquement des mesures, ce qui fait que l’on doit adapter la formule. Une mesure IF ou SWITCH de DAX demande une expression qui permet de déterminer une valeur unique ou une mesure, elle ne peut donc pas se raccrocher à toute une colonne qui, par définition, contient de multiples lignes.

La syntaxe de IF pour DAX est la suivante :

IF(<testlogique>, <ValeurSiVrai>[, <ValeurSiFaux>])

Celle-ci met en avant quelques principes du DAX de datamart.

Ainsi, c’est la formule DAX suivante qui fonctionne parfaitement dans une mesure du datamart (code réf. DAX 4.20) :

test76 = IF(SELECTEDVALUE(Vendeurs[Departement])="76",  
"Seine-Maritime","inconnu") 
images/Ch4-25Nouveau.png

La formule suivante indique « Seine-Maritime » lorsque le département du vendeur est 76 et « inconnu » dans le cas contraire.

SELECTEDVALUE(nomdecolonne) retourne la valeur de la colonne nomdecolonne lorsqu’il n’y a qu’une seule valeur dans cette colonne.

En revanche, la formule suivante trop simpliste ne peut pas fonctionner :

NomduDeparttHS = IF(Vendeurs[Departement]="76","Seine maritime","inconnu") 

Elle soulève l’erreur suivante de la part du datamart, qui apparaît en jaune sous la formule DAX dans l’éditeur :

images/Ch4-520.png
A single value for column Department in table 'Vendeurs' 
cannot be determined. 

Ce message du logiciel signifie en français :

« Il est impossible de déterminer une valeur unique pour la colonne "Departement" de la table "Vendeurs". Cela peut se produire quand une formule de mesure fait référence à une colonne qui contient de nombreuses valeurs, sans spécifier d’agrégation telle que min, max, count ou sum pour obtenir un résultat unique. »

Ceci arrive parce que la condition de la formule...