Calculs Time Intelligence supplémentaires

Effectué

Il existe d’autres fonctions Time Intelligence DAX qui retournent une seule date. Vous en apprendrez davantage sur ces fonctions en les appliquant dans deux scénarios différents.

Les fonctions DAX FIRSTDATE et LASTDATE retournent la première et la dernière date dans le contexte de filtre actuel pour la colonne de dates spécifiée.

Calculer de nouvelles occurrences

Une autre utilisation des fonctions Time Intelligence consiste à compter les nouvelles occurrences. L’exemple suivant montre comment vous pouvez calculer le nombre de nouveaux clients pour une période donnée. Un nouveau client est compté au cours de la période pendant laquelle il a effectué son premier achat.

Votre première tâche consiste à ajouter la mesure suivante à la table Sales qui compte le nombre de clients distincts à ce jour (LTD, « life-to-date »). L’expression « à ce jour » signifie depuis le début de la période jusqu’à la dernière date du contexte de filtre. Mettez en forme la mesure en tant que nombre entier en utilisant le séparateur de milliers.

Customers LTD =
VAR CustomersLTD =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MAX('Date'[Date])
        ),
        'Sales Order'[Channel] = "Internet"
    )
RETURN
    CustomersLTD

Ajoutez la mesure Customers LTD au visuel matrice. Notez qu’il produit un résultat de clients distincts LTD jusqu’à la fin de chaque mois.

La fonction DATESBETWEEN retourne une table contenant une colonne de dates qui commence à une date de début donnée et continue jusqu’à une date de fin donnée. Lorsque la date de début est vide, la première date de la colonne de date est utilisée. (Inversement, lorsque la date de fin est vide, la dernière date de la colonne de date est utilisée.) Dans ce cas, la date de fin est déterminée par la fonction MAX, qui retourne la dernière date dans le contexte de filtre. Ainsi, si le mois d’août 2017 est dans le contexte de filtre, la fonction MAX retourne le 31 août 2017, tandis que la fonction DATESBETWEEN retourne toutes les dates jusqu’au 31 août 2017.

Ensuite, vous allez modifier la mesure en la renommant New Customers (Nouveaux clients) et en ajoutant une deuxième variable pour stocker le nombre de clients distincts avant la période dans le contexte de filtre. La clause RETURN soustrait maintenant cette valeur des clients LTD pour produire un résultat, qui correspond au nombre de nouveaux clients dans la période.

New Customers =
VAR CustomersLTD =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MAX('Date'[Date])
        ),
    'Sales Order'[Channel] = "Internet"
    )
VAR CustomersPrior =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MIN('Date'[Date]) - 1
        ),
        'Sales Order'[Channel] = "Internet"
    )
RETURN
    CustomersLTD - CustomersPrior

Pour la variable CustomersPrior, notez que la fonction DATESBETWEEN inclut les dates jusqu’à la première date dans le contexte de filtre moins une. Étant donné que Microsoft Power BI stocke en interne les dates sous forme de nombres, vous pouvez ajouter ou soustraire des nombres pour déplacer une date.

Calculs d’instantanés

Parfois, des données de faits sont stockées en tant qu’instantanés dans le temps. Les exemples courants incluent des niveaux de stock ou des soldes de compte. Un instantané des valeurs est chargé périodiquement dans la table.

Lors de la synthèse des valeurs d’instantané (comme les niveaux de stock), vous pouvez synthétiser les valeurs sur n’importe quelle dimension, à l’exception de la date. L’ajout des décomptes du niveau de stock entre les catégories de produits donne une synthèse significative, mais pas l’ajout des décomptes du niveau de stock entre les dates. L’ajout du niveau du stock d’hier à celui d’aujourd’hui n’est pas une opération utile (à moins que vous ne souhaitiez obtenir une moyenne de ce résultat).

Lorsque vous synthétisez des tables d’instantanés, les formules de mesure peuvent utiliser des fonctions Time Intelligence DAX pour appliquer un filtre de date unique.

Dans l’exemple suivant, vous allez explorer un scénario pour la société Adventure Works. Basculez vers la vue de modèle et sélectionnez le diagramme de modèle Inventory (Inventaire).

Notez que le diagramme affiche trois tables : Product (Produit), Date et Inventory (Inventaire). La table Inventory stocke des instantanés des soldes unitaires pour chaque date et chaque produit. Plus important encore, la table ne contient aucune date manquante et aucune entrée dupliquée pour un produit à la même date. En outre, le dernier enregistrement d’instantané est stocké pour la date du 15 juin 2020.

Maintenant, basculez vers la vue rapport et sélectionnez la page 2 du rapport. Ajoutez la colonne UnitsBalance de la table Inventory au visuel matrice. Sa synthèse par défaut est définie sur les valeurs de somme.

Cette configuration visuelle est un exemple de la manière de ne pas synthétiser une valeur d’instantané. L’ajout de soldes d’instantané quotidiens ne produit pas un résultat significatif. Par conséquent, supprimez le champ UnitsBalance du visuel matrice.

À présent, vous allez ajouter à la table Inventory une mesure qui additionne la valeur UnitsBalancepour une seule date. La date est la dernière date de chaque période. Cela s’obtient à l’aide de la fonction LASTDATE. Mettez en forme la mesure en tant que nombre entier avec le séparateur de milliers.

Stock on Hand =
CALCULATE(
    SUM(Inventory[UnitsBalance]),
    LASTDATE('Date'[Date])
)

Notes

Notez que la formule de mesure utilise la fonction SUM. Une fonction d’agrégation doit être utilisée (les mesures n’autorisent pas les références directes aux colonnes), mais étant donné qu’une seule ligne existe pour chaque produit pour chaque date, la fonction SUM ne fonctionne que sur une seule ligne.

Ajoutez la mesure Stock on Hand (Stock disponible) au visuel matrice. La valeur pour chaque produit est maintenant basée sur le dernier solde unitaire enregistré pour chaque mois.

La mesure retourne des cellules vides pour « June 2020 », car aucun enregistrement n’existe pour la dernière date en juin. Selon les données, il n’est pas encore arrivé.

Le filtrage sur la dernière date du contexte de filtre présente des problèmes inhérents : Une date enregistrée n’existe peut-être pas, car elle ne s’est pas encore produite, ou peut-être parce que les soldes du stock ne sont pas enregistrés les week-ends.

L’étape suivante consiste à ajuster la formule de mesure afin de déterminer la dernière date qui a un résultat non vide puis de filtrer sur cette date. Vous pouvez accomplir cette tâche à l’aide de la fonction DAX LASTNONBLANK.

Utilisez la définition de mesure suivante pour modifier la mesure Stock on Hand.

Stock on Hand =
CALCULATE(
    SUM(Inventory[UnitsBalance]),
    LASTNONBLANK(
        'Date'[Date],
        CALCULATE(SUM(Inventory[UnitsBalance]))
    )
)

Dans le visuel matrice, notez les valeurs pour juin 2020 et le total (représentant l’année entière).

La fonction LASTNONBLANK est une fonction d’itérateur. Elle retourne la dernière date qui produit un résultat non vide. Elle obtient ce résultat en effectuant une itération sur toutes les dates dans le contexte de filtre dans l’ordre chronologique décroissant. (À l’inverse, la fonction FIRSTNONBLANK itère dans l’ordre chronologique croissant.) Pour chaque date, elle évalue l’expression transmise. Lorsqu’elle rencontre un résultat non vide, la fonction retourne la date. Cette date est ensuite utilisée pour filtrer la fonction CALCULATE.

Notes

La fonction LASTNONBLANK évalue son expression dans le contexte de ligne. La fonction CALCULATE doit être utilisée pour effectuer la transition du contexte de ligne vers le contexte de filtre, afin d’évaluer correctement l’expression.

Maintenant, masquez la colonne UnitsBalance de la table Inventory. Cela empêchera les auteurs de rapports de synthétiser de manière inappropriée les soldes unitaires d’instantané.