Utiliser des variables pour améliorer vos formules DAX

En tant que modeleur de données, l’écriture et le débogage de certains calculs DAX peuvent s’avérer difficiles. Les exigences de calcul complexes impliquent souvent d’écrire des expressions composées ou complexes. Les expressions composées peuvent impliquer l’utilisation de nombreuses fonctions imbriquées, et éventuellement la réutilisation de la logique d’expression.

L’utilisation de variables dans vos formules DAX peut vous aider à écrire des calculs plus complexes et efficaces. Les variables peuvent améliorer les performances, la fiabilité et la lisibilité, et réduire la complexité.

Dans cet article, nous allons démontrer les trois premiers avantages en utilisant un exemple de mesure de la croissance des ventes année par année. (La formule de croissance des ventes année par année est la période de vente moins les ventes de la même période de l’année précédente, divisée par les ventes de la même période de l’année précédente.)

Commençons par la définition de mesure suivante.

Sales YoY Growth % =
DIVIDE(
    ([Sales] - CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))),
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
)

La mesure produit le résultat correct, mais intéressons-nous maintenant à la manière de l’améliorer.

Améliorer les performances

Notez que la formule répète l’expression qui calcule « même période de l’année précédente ». Cette formule est inefficace, car elle demande que Power BI évalue deux fois la même expression. La définition de mesure peut être rendue plus efficace à l’aide d’une variable, VAR.

La définition de mesure suivante représente une amélioration. Elle utilise une expression pour affecter le résultat « même période de l’année précédente » à une variable nommée SalesPriorYear. La variable est ensuite utilisée deux fois dans l’expression RETURN.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)

La mesure continue à produire le résultat correct et le fait environ deux fois plus vite.

Améliorer la lisibilité

Dans la définition de mesure précédente, remarquez comme le choix du nom de la variable rend l’expression RETURN plus simple à comprendre. L’expression est courte et auto-descriptive.

Simplifier le débogage

Les variables peuvent également vous aider à déboguer une formule. Pour tester une expression affectée à une variable, vous réécrivez provisoirement l’expression RETURN pour générer la variable.

La définition de mesure suivante retourne uniquement la variable SalesPriorYear. Remarquez comme elle commente l’expression RETURN prévue. Cette technique vous permet de la rétablir facilement une fois que le débogage est terminé.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    --DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)
    SalesPriorYear

Réduire la complexité

Dans les versions antérieures de DAX, les variables n’étaient pas encore prises en charge. Les expressions complexes qui ont introduit de nouveaux contextes de filtre devaient utiliser les fonctions DAX EARLIER ou EARLIEST pour faire référence à des contextes de filtre externes. Malheureusement, les modeleurs de données ont trouvé ces fonctions difficiles à comprendre et à utiliser.

Les variables sont toujours évaluées en dehors des filtres que votre expression RETURN applique. C’est pourquoi, lorsque vous utilisez une variable dans un contexte de filtre modifié, elle obtient le même résultat que la fonction EARLIEST. L’utilisation des fonctions EARLIER ou EARLIEST peut donc être évitée. Cela signifie que vous pouvez désormais écrire des formules qui sont moins complexes et plus faciles à comprendre.

Considérez la définition de colonne calculée suivante ajoutée à la table Subcategory. Elle évalue un classement pour chaque sous-catégorie de produit en fonction des valeurs de la colonne Subcategory Sales.

Subcategory Sales Rank =
COUNTROWS(
    FILTER(
        Subcategory,
        EARLIER(Subcategory[Subcategory Sales]) < Subcategory[Subcategory Sales]
    )
) + 1

La fonction EARLIER est utilisée pour faire référence à la valeur de la colonne Subcategory Salesdans le contexte de ligne actuel.

La définition de colonne calculée peut être améliorée à l’aide d’une variable au lieu de la fonction EARLIER. La variable CurrentSubcategorySales stocke la valeur de la colonne Subcategory Salesdans le contexte de ligne actuel, puis l’expression RETURN l’utilise dans un contexte de filtre modifié.

Subcategory Sales Rank =
VAR CurrentSubcategorySales = Subcategory[Subcategory Sales]
RETURN
    COUNTROWS(
        FILTER(
            Subcategory,
            CurrentSubcategorySales < Subcategory[Subcategory Sales]
        )
    ) + 1