Exercice : Combiner les résultats de tables en utilisant l’opérateur join

Effectué

Dans cet exercice, vous découvrirez comment utiliser l’opérateur join. Pour rappel, l’opérateur join fusionne les lignes de deux tables en mettant en correspondance les valeurs des colonnes spécifiées de chaque table.

Nous allons utiliser les résultats de l’opérateur join pour répondre à des questions sur les ventes.

Utilisez l’opérateur join

Dans notre scénario d’entreprise de distribution, votre équipe vous demande de lister les trois pays qui ont le plus de ventes.

Alors que vous commencez à inspecter la table SalesFact, vous remarquez que les chiffres dont vous avez besoin sont disponibles dans la colonne SalesAmount, mais que la table ne contient aucune donnée relative au pays ou à la région. En examinant les autres tables, vous remarquez que les données de pays sont disponibles dans la colonne RegionCountryName de la table Customers. Vous notez également que les deux tables ont une colonne CustomerKey.

Comme les données sont réparties sur deux tables, vous avez à la fois besoin des données sur les clients et des données sur les ventes pour écrire une requête qui permette d’obtenir les informations demandées. Pour écrire la requête, vous utilisez l’opérateur join et la colonne CustomerKey pour faire correspondre les lignes des deux tables.

Vous êtes prêt maintenant à écrire la requête. Vous utilisez une internejoin pour obtenir toutes les lignes correspondantes des deux tables. Pour de meilleures performances, utilisez la table de dimension des clients comme table de gauche et la table de faits des ventes comme table de droite.

Dans la procédure qui suit, vous générerez la requête par étapes afin de mieux comprendre le résultat de l’utilisation de l’opérateur join.

  1. Exécutez la requête suivante pour obtenir 10 lignes correspondantes arbitraires dans les tables Customers et SalesFact.

    Exécuter la requête

    Customers
    | join kind=inner SalesFact on CustomerKey
    | take 10
    

    Examinez la liste résultante. Notez que la table contient des colonnes de la table Customers suivies des colonnes correspondantes de la table SalesFact.

  2. Exécutez la requête suivante pour synthétiser les tables jointes afin d’obtenir les trois pays qui ont le plus de ventes.

    Exécuter la requête

    Customers
    | join kind=inner SalesFact on CustomerKey
    | summarize TotalAmount = round(sum(SalesAmount)) by RegionCountryName
    | top 3 by TotalAmount
    

    Les résultats doivent ressembler à ceux de l’image suivante :

    Screenshot of the join operator query, showing the top three countries/regions by sales.

  3. Examinez la liste résultante. Essayez de modifier la requête pour afficher également le coût total et le bénéfice correspondants pour ces pays/régions.

Votre équipe vous demande ensuite d’identifier les pays/régions avec les chiffres d’affaires les plus bas au cours de la dernière année enregistrée, par mois. Pour obtenir ces données, vous devez utiliser une requête similaire. Mais cette fois, vous utilisez la fonction startofmonth() pour faciliter le regroupement par mois. Vous utilisez également la fonction d’agrégation arg_min() pour rechercher les pays/régions avec le plus petit chiffre d’affaires pour chaque mois.

  1. Exécutez la requête suivante.

    Exécuter la requête

    Customers
    | join kind=inner SalesFact on CustomerKey
    | summarize TotalAmount = round(sum(SalesAmount))
        by Month = startofmonth(DateKey), RegionCountryName
    | summarize arg_min(TotalAmount, RegionCountryName) by Month
    | top 12 by Month desc
    

    Les résultats doivent ressembler à ceux de l’image suivante :

    Screenshot of the join operator query, showing the countries/regions with the lowest revenues.

  2. Examinez chaque ligne. Notez que la première colonne montre les mois de l’année précédente dans l’ordre décroissant, suivie de colonnes montrant les ventes totales pour le pays/la région ayant les chiffres de ventes les plus faibles pour ce mois.

Utiliser le type join rightouter

Votre équipe commerciale souhaite connaître le total des ventes par catégorie de produit. En examinant les données disponibles, vous réalisez que vous avez besoin de la table Products pour obtenir la liste des catégories de produits et de la table SalesFactqui contient les données relatives aux ventes. Vous réalisez également que vous devez compter les ventes de chaque catégorie et lister toutes les catégories de produits.

Après avoir analysé la demande, vous choisissez d’utiliser rightouterjoin, car elle retourne tous les enregistrements des ventes à partir de la table de droite, enrichis avec les données sur les catégories de produits correspondantes de la table de gauche. Vous écrivez votre requête en utilisant la table Products comme table de dimensions de gauche, en faisant correspondre les données de la table des faits SalesFact et en regroupant le résultat par catégorie de produits.

  1. Exécutez la requête suivante.

    Exécuter la requête

    Products
    | join kind=rightouter SalesFact on ProductKey
    | summarize TotalSales = count() by ProductCategoryName
    | order by TotalSales desc
    

    Les résultats doivent ressembler à ceux de l’image suivante :

    Screenshot of the join operator query, showing the total sales per product.

  2. Notez que le temps d’exécution est de 0,834 secondes, bien que cela puisse varier d’une exécution à l’autre. Cette requête est l’une des façons d’obtenir cette réponse et c’est un bon exemple de requête qui n’est pas optimisée pour les performances. Vous pourrez par la suite comparer ce temps avec le temps d’exécution d’une requête équivalente en utilisant l’opérateur lookup, qui est optimisé pour ce type de données.

Utiliser le type join rightanti

De même, votre équipe commerciale souhaite connaître le nombre de produits qui ne se vendent pas dans chaque catégorie de produits. Vous pouvez utiliser une joinrightanti pour obtenir toutes les lignes de la table Products qui ne correspondent à aucune ligne de la table SalesFacts, puis regrouper les résultats par catégorie de produits.

  1. Exécutez la requête suivante.

    Exécuter la requête

    SalesFact
    | join kind=rightanti Products on ProductKey
    | summarize Count = count() by ProductCategoryName
    | order by Count desc
    

    Les résultats doivent ressembler à ceux de l’image suivante :

    Screenshot of the join operator query, showing the number of products that don't sell in each product category.

    Examinez chaque ligne. Les résultats indiquent le nombre de produits invendus par catégorie de produits. Notez que le rightanti join sélectionne uniquement les produits qui n’ont pas de faits de vente, ce qui indique qu’il n’y a pas eu de ventes pour les produits retournés par l’opérateur join.