Comment simuler une jointure externe complète dans Excel?

34

Supposons que j'ai des données dans Excel (et non dans une vraie base de données). Dans une feuille, j'ai des données, où une colonne fonctionne comme l'ID, et je me suis assuré que les valeurs de cette colonne sont uniques. Dans une autre feuille, j'ai également quelques données, encore une fois avec une colonne qui peut être considérée comme un ID, et elle est également unique. Si la ligne N de la feuille 1 a une certaine valeur et que la ligne M de la feuille 2 a la même valeur, je suis sûr que la ligne N et la ligne M décrivent le même objet du monde réel.

Ce que je demande: comment obtenir l'équivalent d'une jointure externe complète sans écrire de macros? Les formules et toutes les fonctions accessibles via le ruban sont OK.

Un petit exemple de "lecture de données":

Feuille 1:

Dostoyevski    Russia
Pushkin        Russia
Shelley        England
Flaubert       France
Hugo           France
Eichendorff    Germany
Byron          England
Zola           France

Fiche 2:

Shelley        Percy Bysshe
Eichendorff    Josef Freiherr Von
Flaubert       Gustave
Byron          Lord
Keller         Gottfried
Dostoyevski    Fyodor
Zola           Emile
Balzac         Honoré de

Sortie souhaitée (le tri n'est pas important):

Dostoyevski    Russia   Fyodor
Pushkin        Russia
Shelley        England  Percy Bysshe
Flaubert       France   Gustave
Hugo           France
Eichendorff    Germany  Josef Freiherr von
Byron          England  Lord
Zola           France   Emile
Keller                  Gottfried
Balzac                  Honoré de

À tous ceux qui sont horrifiés par ce scénario: je sais que c'est la mauvaise façon de le faire. Si j'ai le choix, je n'utiliserais pas Excel pour cela. Cependant, il existe suffisamment de situations où une solution pragmatique est nécessaire, la statistique et une meilleure solution (du point de vue informatique) ne peuvent pas être appliquées.

rumtscho
la source
Si vous triez les deux listes et les placez côte à côte, il devrait être assez facile de faire correspondre manuellement la colonne souhaitée. Si vous avez beaucoup de données, vous pouvez écrire une fonction qui prend deux plages et le fait pour vous.
Dan
@Dan comme je l'ai dit, je demande de le faire sans écrire de fonction . Dans les situations où je peux l'écrire, la solution est triviale (au moins pour moi, parce que j'ai déjà écrit VBA)
rumtscho
Excel prend en charge les requêtes SQL via des connexions de données. Je suis horrible à ce sujet, donc je ne peux malheureusement pas offrir beaucoup plus de conseils, mais cela peut valoir la peine d'être étudié pour vous.
Kyle
@Kyle J'ai ajouté cette option à ma réponse. Ce n'est pas pour les faibles de cœur et car cela pourrait être un gâchis à jouer et / ou à surpasser, mais bon, pourquoi pas!
enderland

Réponses:

44

Approche facile - opérations Excel standard

Tout d'abord, copiez / collez les deux colonnes clés des deux tables dans une seule nouvelle feuille en une seule colonne.

Utilisez le "Supprimer les doublons" pour obtenir la liste unique de toutes vos clés uniques.

Ensuite, ajoutez deux colonnes (dans ce cas), une pour chacune de vos colonnes de données dans chaque table. Je vous recommande également d'utiliser le format comme option de tableau car cela rend vos formules beaucoup plus agréables. À l'aide de vlookup, utilisez la formule suivante:

=IFERROR(VLOOKUP([@ID],Sheet4!A:B,2,FALSE),"")

Sheet4!A:Breprésente la table de données de la table source pour chaque valeur respective. L'IFERROR empêche les résultats laids # N / A qui apparaissent lorsque vlookup échoue et dans ce cas, renvoie une cellule vide.

Cela vous donne votre tableau résultant.


Feuille3:

entrez la description de l'image ici

Sheet4:

entrez la description de l'image ici

Données de résultat:

entrez la description de l'image ici

Formules de résultat ( Ctrl+ ~basculera ceci):

entrez la description de l'image ici


Requête SQL intégrée

Vous pouvez également le faire avec la requête SQL intégrée. C'est ... beaucoup moins convivial, mais ce sera peut-être un meilleur cas d'utilisation. Cela nécessitera probablement que vous ayez formaté vos données "source" sous forme de tableaux.

  1. Cliquez sur une cellule dans une nouvelle feuille
  2. Accédez à Données -> À partir d'autres sources -> À partir de Microsoft Query
  3. Sélectionnez Fichiers Excel * sous l'onglet Bases de données et appuyez sur ok
  4. Sélectionnez votre classeur
  5. Sélectionnez les quatre champs suivants:
    • entrez la description de l'image ici
  6. Cliquez sur "suivant" et "ok" au bel avertissement formaté des années 90 que vous voyez
  7. En suivant ces instructions, créez la première jointure gauche gauche. Dans mon cas, j'utilise le tableau "pays" comme source de gauche et les "noms" comme droite.
    • entrez la description de l'image ici
    • Cela ne donne que certaines des lignes (puisque vous vous joignez à l'ID)
  8. La partie "créer une soustraction de souscription puis l'ajouter en tant qu'union" est plus compliquée.

    • Voici les configurations de jointure de soustraction: entrez la description de l'image ici
    • Copiez le SQL de cette jointure à partir du bouton SQL:
    • SELECT countries$.ID, countries$.Val1, names$.ID, names$. Val2 DE {oj C:\Users\Username\Desktop\Book2.xlsx. countries$ countries$JOINT EXTERIEUR GAUCHE C:\Users\Username\Desktop\Book2.xlsx. names$ names$ON countries$.ID = names$.ID} names$OERE ( .ID est nul)

  9. Revenez à la première jointure externe que vous avez créée. Modifiez manuellement le SQL et

    • ajouter Unionen bas
    • Ajoutez le texte de jointure ci-dessus au bas de la jointure
  10. Appuyez sur le bouton "Return Data" immédiatement à gauche du bouton SQL
    • Vous souhaiterez peut-être modifier le SQL pour sélectionner uniquement les données spécifiques que vous souhaitez à ce stade. Je trouve plus facile de masquer des colonnes dans le résultat.
  11. Placez la requête quelque part et confirmez son emplacement
    • entrez la description de l'image ici

Pas pour les faibles de cœur. Mais si vous voulez avoir une grande chance de voir des parties d'Office non mises à jour aussi longtemps que vous pourriez avoir été en vie, c'est une grande chance.

enderland
la source
1
Avez-vous une référence pour la notation [@ID]? Je ne doute pas que cela fonctionne, mais je ne l'ai jamais vu auparavant et je fais beaucoup de travail dans Excel.
TJL
1
@TJL si vous formatez un tableau en tant que tableau, il utilisera ce type de notation pour référencer d'autres colonnes. Beaucoup plus clair que les références de cellule. Ce pourrait être une fonctionnalité 2010+? Je ne suis pas sûr. Je n'ai pas utilisé la magie du formatage comme table avant 2010 ..
enderland
Ne pouvez-vous pas simplement remplacer le mot LEFT par le mot FULL dans la requête d'origine? Je suis sûr qu'il utilise simplement le pilote ACE OLEDB pour exécuter cette requête, qui prend en charge la syntaxe FULL JOIN.
Kyle Hale
14

Comme solution alternative, puis-je suggérer Power Query ? C'est un complément Excel gratuit de Microsoft pour effectuer exactement ce genre de chose. Sa fonctionnalité sera également directement incluse dans Excel 2016, donc elle est à l'épreuve du temps.

Quoi qu'il en soit, avec Power Query, les étapes sont assez simples:

  1. Importez les deux tables en tant que requêtes dans l'éditeur de requêtes Power.
  2. Effectuez une transformation Fusionner les requêtes sur eux, en définissant la colonne de jointure appropriée et en définissant le type de jointure comme Plein externe.
  3. Chargez votre tableau de résultats dans une nouvelle feuille.

La bonne chose à ce sujet est qu'une fois que vous avez configuré cela, si vous apportez des modifications à vos tableaux de données de base, vous cliquez simplement sur Données> Tout actualiser et votre feuille de résultats Power Query est également mise à jour.

Kyle Hale
la source
Vraiment intéressant. Un de mes amis qui possède un restaurant m'a posé des questions sur MS Office et m'a montré sa suite 2016, qui ne comprend pas MS Access. Je vois maintenant pourquoi c'est. Excel avait beaucoup de limitations. Je n'ai jamais acheté au-dessus de 2003 car aucune des caractéristiques n'avait de valeur et je n'aimais pas non plus le nouveau look; 2010 et au-dessus. Access fait tout cela et plus encore, ce qui soulève la question: pourquoi tant de gens essaient-ils de travailler avec Database dans Excel alors qu'Access est le moyen d'y parvenir? La seule chose que je peux voir, c'est que peut-être pour faire fonctionner une bonne base de données Access, il faut également une bonne expérience VB.
ejbytes
@ejbytes la plupart des gens comprennent le concept des feuilles de calcul. La plupart ne comprennent pas le concept d'une base de données. J'ai eu un projet de conversion d'un projet de feuille de calcul en tant que base de données en une base de données et les utilisateurs l' appelaient toujours "la feuille de calcul" - même après des explications détaillées sur le fonctionnement d'une base de données!
enderland
@enderland Je pense que vous avez raison. Une feuille de calcul avec des règles non rigoureuses et une flexibilité non contiguë ... et des requêtes déguisées en filtres. Une plate-forme pour les tableaux et listes de fortune.
ejbytes
La version @ejbytes tldr est MS voulait tester un moteur de mémoire columnstore dans Excel pour laisser plus de lignes, il comprenait des connexions de données externes, il s'est avéré très populaire, alors ils ont ajouté un outil ETL. Maintenant, ils ont rassemblé tous les outils sous le nom de PowerBI.
Kyle Hale
@KyleHale J'utilise Office 2010 et j'essaye de faire une FULL OUTER JOIN, mais Power Query ignore les ID de la deuxième table qui ne sont pas dans la première table.
GeMir
0

Un moyen rapide de semi-simuler une (jointure externe) consiste à prendre votre deuxième liste et à la coller directement sous votre première liste, c'est-à-dire que vos (clés primaires) sont toutes dans la même colonne (principale). Ensuite, triez cette colonne principale, vous vous retrouverez avec une liste entrelacée, puis effectuez une équation IF transposée (le superutilisateur gâche la vue de la disposition du tableau ..):

listA listB


sam blue tim 32874 tim red mary 5710 chris green gustav 047 fred blue
mary black

copier / coller / trier, le résultat ressemble à ceci: AB chris vert fred bleu gustav 047 mary 5710 mary noir sam bleu tim 32874 tim rouge

alors formule pour la cellule c1: (c1) = if (A1 = A2, B2)

le résultat ressemble à ceci:

ABC chris vert FAUX fred bleu bleu FAUX gustav 047 FAUX marie 5710 noir marie noir FAUX sam bleu FAUX tim 32874 rouge tim rouge FAUX

Triez C pour vous débarrasser des faux, etc. C'est une version de base de l'idée, il suffit de la développer si plus de données sont nécessaires. -wag770310

d587793
la source
Pouvez-vous formater cela de quelque manière que ce soit pour le rendre lisible?
davidbaumann