Power Query Excel : Les 7 jointures possibles
par
, 25/11/2020 à 08h00 (12820 Affichages)
Salut.
Les jointures font partie intégrante d'une maîtrise de Power Query. Je rencontre très souvent sur le forum des questions liées à la fusion de 2 requêtes, un peu à la manière d'un RECHERCHEV, d'un RECHERCHEX (XL 365) ou d'un INDEX-EQUIV. Si les jointures interne (inner join) ou gauche (left join ou left outer join) sont probablement choisies dans la majorité des cas, il peut être intéressant de connaître les 7 manières de "joindre" deux tables, c'est-à-dire d'aligner les lignes desdites tables.
Schéma des 7 jointures possibles en SQL avec leur appellation "Power Query"
Rappel sur la création d'une requête de fusion avec Power Query.
Via Accueil > Fusionner les requêtes, on peut fusionner deux requêtes. La requête active est réputée être celle de gauche, et l'on choisira la seconde requête comme étant celle de droite. On choisira la ou les colonnes permettant de créer la clause d'union (1) puis l'on choisira le type de requête.
Dans ce billet, j'explique comment fusionner deux tables sur une clé composée, c'est-à-dire multicolonnes.
La notion Gauche/Droite n'a pas d'importance sur la fusion proprement dite, c'est-à-dire sur l'appairage des lignes, mais elle détermine l'ordre des colonnes de la requête de résultat, les colonnes de la requête gauche étant toutes reprises et celles de droite pouvant être choisies lors de l'étape de développement de la table.
Mise en pratique
Dans la mise en pratique ci-dessous, je mentionne la ligne de commande de l'étape Power Query de fusion, et je reprends le début de l'intitulé de l'option de jointure qui correspond dans la liste déroulante de la boite de dialogue de fusion.
Interne : = Table.NestedJoin(Gauche, {"ID L"}, Droite, {"ID R"}, "Droite", JoinKind.Inner). Seules les lignes 3,4,5, communes aux deux tables, sont reprises dans cette requête
Externe gauche : = Table.NestedJoin(Gauche, {"ID L"}, Droite, {"ID R"}, "Droite", JoinKind.LeftOuter). Toutes les lignes de gauche sont reprises et appairées à celles de droite qui valident la jointure. Les colonnes développées à droite sont Null pour les lignes non appairées.
Externe droite : = Table.NestedJoin(Gauche, {"ID L"}, Droite, {"ID R"}, "Droite", JoinKind.RightOuter). Toutes les lignes de droite sont reprises et appairées à celles de gauche qui valident la jointure. Les colonnes de gauche sont Null pour les lignes non appairées.
Gauche opposée : = Table.NestedJoin(Gauche, {"ID L"}, Droite, {"ID R"}, "Droite", JoinKind.LeftAnti). Seules sont reprises les lignes de gauche qui ne se retrouvent pas à droite. Les colonnes de droite sont Null (elles ne sont dans les faits pas reprises car inutiles).
Droite opposée : = Table.NestedJoin(Gauche, {"ID L"}, Droite, {"ID R"}, "Droite", JoinKind.RightAnti). Seules sont reprises les lignes de droite qui ne se retrouvent pas à gauche. Les colonnes de gauche sont Null (elles ne sont dans les faits pas reprises car inutiles).
Externe entière : = Table.NestedJoin(Gauche, {"ID L"}, Droite, {"ID R"}, "Droite", JoinKind.FullOuter). Toutes les lignes des deux tables sont reprises. Les colonnes des lignes non appairées sont Null dans les colonnes des tables correspondantes.
Externe opposée(2) : = Table.NestedJoin(Gauche, {"ID L"}, Droite, {"ID R"}, "Droite", JoinKind.FullOuter). Seules les lignes qui ne sont pas communes sont reprises.
Pour créer cette jointure, on va utiliser une Externe entière puis on va exclure les lignes pour lesquelles la clé d'union est vide dans l'une ou l'autre table. Cela sera réalisé grâce à l'ajout d'une colonne calculée qui sera filtrée sur le résultat de la condition.
Voilà pour la théorie et la mise en pratique. Dans un prochain billet, nous verrons des exemples d'utilisation de ces jointures.
(1) Dans un prochain billet, je montrerai comment créer une jointure lorsque la clé d'appairage est constituée de plusieurs colonnes.
(2) Je n'ai pas trouvé d'appellation généralement reconnue pour cette jointure particulière.