Syntaxe DAX

Cet article décrit la syntaxe et les conditions requises du langage d’expression de formule DAX.

Conditions requises de la syntaxe

Une formule DAX commence toujours par un signe égal (=). Après le signe égal, vous pouvez fournir une expression qui prend une valeur scalaire, ou une expression qui peut être convertie en valeur scalaire. Leurs thèmes sont les suivants :

  • Une constante scalaire, ou une expression qui utilise un opérateur scalaire (+,-,*,/,>=,...,&&, ...)

  • Des références à des colonnes ou des tables. Le langage DAX utilise toujours des tables et des colonnes comme entrées de fonctions, jamais un tableau ou un ensemble arbitraire de valeurs.

  • Des opérateurs, constantes et valeurs fournis comme partie d’une expression.

  • Le résultat d’une fonction et de ses arguments obligatoires. Certaines fonctions DAX retournent une table au lieu d’une valeur scalaire et doivent être enveloppées (wrapped) dans une fonction qui évalue la table et retourne une valeur scalaire , sauf si la table a une seule colonne et une seule ligne, elle est traitée comme une valeur scalaire.

    La plupart des fonctions DAX demandent un ou plusieurs arguments, qui peuvent inclure des tables, des colonnes, des expressions et des valeurs. Toutefois, certaines fonctions, telles que PI, ne nécessitent aucun argument, mais nécessitent toujours des parenthèses pour indiquer l’argument null. Par exemple, vous devez toujours taper PI(), et non PI. Vous pouvez également imbriquer des fonctions dans d’autres fonctions.

  • Des expressions. Une expression peut contenir un ou tous les éléments suivants : opérateurs, constantes ou références à des colonnes.

Par exemple, toutes les formules ci-dessous sont valides.

Formule Résultat
= 3 3
= "Sales" Sales
= 'Sales'[Amount] Si vous utilisez cette formule dans la table Sales, vous obtiendrez la valeur de la colonne Amount dans la table Sales pour la ligne actuelle.
= (0,03 *[Amount])

=0.03 * [Amount]
Trois pour cent de la valeur dans la colonne Amount de la table actuelle.

Même si cette formule peut être utilisée pour calculer un pourcentage, le résultat n’est pas affiché sous forme de pourcentage, sauf si vous appliquez la mise en forme dans la table.
= PI() Valeur de la constante pi.

Les formules peuvent se comporter différemment selon leur utilisation. Vous devez toujours connaître le contexte et la façon dont les données que vous utilisez dans la formule sont liées à d’autres données qui risquent d’être utilisées dans le calcul.

Conditions de nommage

Un modèle de données contient souvent plusieurs tables. Ensemble, les tables et leurs colonnes contiennent une base de données stockée dans le moteur d’analytique en mémoire (VertiPaq). Dans cette base de données, toutes les tables doivent avoir des noms uniques. Les noms des colonnes doivent également être uniques dans chaque table. Tous les noms d’objet sont insensibles à la casse ; par exemple, les noms SALES et Sales représentent la même table.

Chaque colonne et chaque mesure que vous ajoutez à un modèle de données existant doivent appartenir à une table spécifique. Vous spécifiez la table qui contient la colonne implicitement quand vous créez une colonne calculée dans une table, ou explicitement quand vous créez une mesure et spécifiez le nom de la table où la définition de la mesure doit être stockée.

Quand vous utilisez une table ou une colonne comme entrée d’une fonction, vous devez généralement qualifier le nom de la colonne. Le nom qualifié complet d’une colonne est le nom de la table, suivi du nom de la colonne entre crochets : par exemple, 'U.S. Sales'[Products]. Un nom qualifié complet est toujours obligatoire quand vous référencez une colonne dans les contextes suivants :

  • En tant qu’argument de la fonction, VALUES

  • En tant qu’argument des fonctions, ALL ou ALLEXCEPT

  • Dans un argument de filtre pour les fonctions, CALCULATE ou CALCULATETABLE

  • En tant qu’argument de la fonction, RELATEDTABLE

  • En tant qu’argument d’une fonction Time Intelligence

Un nom de colonne non qualifié se limite au nom de la colonne entre crochets : par exemple, [Sales Amount]. Par exemple, quand vous référencez une valeur scalaire à partir de la même ligne de la table actuelle, vous pouvez utiliser le nom de colonne non qualifié.

Si le nom d’une table contient des espaces, des mots clés réservés ou des caractères non autorisés, vous devez placer le nom de la table entre guillemets simples. Vous devez également mettre les noms de table entre guillemets si le nom contient des caractères qui ne sont pas dans la plage de caractères alphanumériques ANSI, que vos paramètres régionaux prennent en charge ou non le jeu de caractères. Par exemple, si vous ouvrez un classeur qui contient des noms de table écrits en caractères cyrilliques, tels que « Таблица », le nom de la table doit être placé entre guillemets, même s’il ne contient pas d’espaces.

Notes

Pour faciliter la saisie des noms complets des colonnes, utilisez la fonctionnalité d’autocomplétion dans l’éditeur de formule.

Tables

  • Les noms de table sont obligatoires chaque fois que la colonne provient d’une table différente de la table actuelle. Les noms de table doivent être uniques dans la base de données.

  • Les noms de table doivent être placés entre guillemets simples s’ils contiennent des espaces, d’autres caractères spéciaux ou des caractères alphanumériques qui ne font pas partie de l’alphabet.

Mesures

  • Les noms de mesure doivent toujours être entre crochets.

  • Les noms de mesure peuvent contenir des espaces.

  • Chaque nom de mesure doit être unique dans un modèle. Par conséquent, le nom de la table est facultatif devant un nom de mesure quand une mesure existante est référencée. Toutefois, lorsque vous créez une mesure, vous devez toujours spécifier une table dans laquelle la définition de la mesure est stockée.

Colonnes

Les noms de colonne doivent être uniques dans le contexte d’une table ; cependant, plusieurs tables peuvent avoir des colonnes avec le même nom (la désambiguïsation vient avec le nom de la table).

En général, les colonnes peuvent être référencées sans référencer la table de base à laquelle elles appartiennent, sauf s’il risque d’y avoir un conflit de noms à résoudre ou avec certaines fonctions qui demandent que les noms de colonne soient qualifiés complets.

Mots clés réservés

Si le nom que vous utilisez pour une table est le même qu’un mot clé réservé Analysis Services, une erreur est générée et vous devez renommer la table. Toutefois, vous pouvez utiliser des mots clés dans les noms d’objet si le nom de l’objet est entre crochets (pour les colonnes) ou entre guillemets (pour les tables).

Notes

Les guillemets peuvent être représentés par plusieurs caractères différents, en fonction de l’application. Si vous collez des formules à partir d’un document externe ou d’une page web, veillez à vérifier le code ASCII du caractère utilisé pour les guillemets ouvrants et fermants afin de vous assurer qu’ils sont identiques. Sinon, DAX peut ne pas reconnaître les symboles comme des guillemets, ce qui rend la référence non valide.

Caractères spéciaux

Les caractères et les types de caractères suivants ne sont pas valides dans les noms de table, de colonne ou de mesure :

  • Espaces de début ou de fin ; à moins que les espaces ne soient encadrés par des délimiteurs de nom, des crochets ou des apostrophes simples.

  • Caractères de contrôle

  • Les caractères suivants qui ne sont pas valides dans les noms d’objet :

    .,;':/\*|?&%$!+=()[]{}<>

Exemples de noms d’objet

Le tableau suivant présente des exemples de noms d’objet :

Types d’objet Exemples Commentaire
Nom du tableau Sales Si le nom de table ne contient pas d’espaces ni d’autres caractères spéciaux, il n’est pas nécessaire de le mettre entre guillemets.
Nom du tableau 'Canada Sales' Si le nom contient des espaces, des tabulations ou d’autres caractères spéciaux, mettez le nom entre guillemets simples.
Nom qualifié complet de colonne Sales[Amount] Le nom de la table précède le nom de la colonne et le nom de la colonne est entre crochets.
Nom qualifié complet de mesure Sales[Profit] Le nom de la table précède le nom de la mesure et le nom de la mesure est entre crochets. Dans certains contextes, un nom qualifié complet est toujours obligatoire.
Nom de colonne non qualifié [Amount] Le nom non qualifié est juste le nom de la colonne entre crochets. Les contextes dans lesquels vous pouvez utiliser le nom non qualifié incluent des formules dans une colonne calculée au sein de la même table ou dans une fonction d’agrégation qui analyse la même table.
Colonne qualifiée complète dans une table avec des espaces 'Canada Sales'[Qty] Le nom de la table contient des espaces, il doit donc être entouré de guillemets simples.

Autres restrictions

La syntaxe nécessaire pour chaque fonction et le type d’opération qu’elle peut effectuer varient grandement selon la fonction. En général toutefois, les règles suivantes s’appliquent à toutes les formules et expressions :

  • Les formules et expressions DAX ne peuvent pas modifier ni insérer des valeurs individuelles dans les tables.

  • Vous ne pouvez pas créer de lignes calculées en utilisant DAX. Vous pouvez créer uniquement des colonnes calculées et des mesures.

  • Lorsque vous définissez des colonnes calculées, vous pouvez imbriquer des fonctions à n’importe quel niveau.

  • DAX contient plusieurs fonctions qui retournent une table. En général, vous utilisez les valeurs retournées par ces fonctions comme entrée pour d’autres fonctions, qui nécessitent une table comme entrée.

Opérateurs et constantes DAX

Le tableau suivant liste les opérateurs pris en charge par DAX. Pour plus d’informations sur la syntaxe des opérateurs individuels, consultez Opérateurs DAX.

Type d’opérateur Symbole et utilisation
Opérateur de parenthèse () ordre de priorité et regroupement des arguments
Opérateurs arithmétiques + (addition)

- (signe de soustraction

)

* (multiplication)

/ (division)

^ (élévation à une puissance)
Opérateurs de comparaison = (égal à)

> (supérieur à)

< (inférieur à)

>= (supérieur ou égal à)

<= (inférieur ou égal à)

<> (différent de)
Opérateur de concaténation de texte & (concaténation)
Opérateurs logiques && (and)

|| (ou)

Type de données

Vous n’avez pas besoin de caster, convertir ou spécifier le type de données d’une colonne ou d’une valeur que vous utilisez dans une formule DAX. Lorsque vous utilisez des données dans une formule DAX, DAX identifie automatiquement les types de données dans les colonnes référencées et les valeurs que vous tapez, puis effectue des conversions implicites si nécessaire pour effectuer l’opération spécifiée.

Par exemple, si vous essayez d’ajouter un nombre à une valeur de date, le moteur interprète l’opération dans le contexte de la fonction et convertit les nombres en un type de données courant, puis présente le résultat dans le format prévu, une date.

Toutefois, il existe certaines limitations sur les valeurs qui peuvent être converties avec succès. Si une valeur ou une colonne a un type de données qui est incompatible avec l’opération en cours, DAX retourne une erreur. De plus, DAX ne fournit pas de fonctions qui vous laissent explicitement changer, convertir ou caster le type de données des données existantes que vous avez importées dans un modèle de données.

Important

DAX ne prend pas en charge l’utilisation du type de données Variant. Par conséquent, quand vous chargez ou importez des données dans un modèle de données, les données de chaque colonne sont généralement d’un type de données cohérent.

Certaines fonctions retournent des valeurs scalaires, notamment des chaînes, tandis que d’autres marchent avec des nombres, entiers et réels, ou des dates et des heures. Le type de données nécessaire pour chaque fonction est décrit dans la section Fonctions DAX.

Vous pouvez utiliser des tables contenant plusieurs colonnes et plusieurs lignes de données comme argument d’une fonction. Certaines fonctions retournent aussi des tables, qui sont stockées en mémoire et peuvent être utilisées comme arguments pour d’autres fonctions.

Date et heure

DAX stocke les valeurs de date et d’heure à l’aide du type de données DateHeure utilisé par Microsoft SQL Server. Le format DateHeure utilise un nombre à virgule flottante où les valeurs Date correspondent à la partie entière représentant le nombre de jours depuis le 30 décembre 1899. Les valeurs d’heure correspondent à la partie décimale d’une valeur d’une date où les heures, les minutes et les secondes sont représentées par des fractions décimales d’un jour. Les fonctions de date et d’heure DAX convertissent implicitement les arguments en type de données DateHeure.

Remarque

La valeur DateTime maximale exacte prise en charge par DAX est le 31 décembre 9999 00:00:00.

Littéral de date et d’heure

À partir de la version d’août 2021 de Power BI Desktop, les valeurs Date et DateHeure de DAX peuvent être spécifiées en tant que littéral au format dt"YYYY-MM-DD", dt"YYYY-MM-DDThh:mm:ss" ou dt"YYYY-MM-DD hh:mm:ss". Quand elles sont spécifiées en tant que littéral, il n’est pas nécessaire d’utiliser les fonctions DATE, TIME, DATEVALUE et TIMEVALUE dans l’expression.

Par exemple, l’expression suivante utilise des fonctions DATE et TIME pour filtrer sur OrderDate :

EVALUATE
FILTER (
        FactInternetSales,
        [OrderDate] > (DATE(2015,1,9) + TIME(2,30,0)) &&[OrderDate] < (DATE(2015,12,31) + TIME(11,59,59))
)

La même expression de filtre peut être spécifiée en tant que littéral :

EVALUATE
FILTER (
        FactInternetSales,
        [OrderDate] > dt"2015-1-9T02:30:00" && [OrderDate] < dt"2015-12-31T11:59:59"
)

Notes

Le format DAX littéral de type Date et DateHeure n’est pas pris en charge dans toutes les versions de Power BI Desktop, d’Analysis Services et de Power Pivot dans Excel. Les fonctionnalités DAX qui sont nouvelles ou mises à jour sont généralement introduites dans Power BI Desktop, puis incluses ultérieurement dans Analysis Services et Power Pivot dans Excel.