Come simulare un join esterno completo in Excel?


34

Supponiamo che io abbia alcuni dati in Excel (e non in un vero database). In un foglio, ho dei dati, in cui una colonna funziona come ID e mi sono assicurato che i valori in questa colonna siano univoci. In un altro foglio, ho anche alcuni dati, sempre con una colonna che può essere presa come ID, ed è anche unica. Se la riga N nel foglio 1 ha un valore e la riga M nel foglio 2 ha lo stesso valore, sono sicuro che la riga N e la riga M descrivono lo stesso oggetto del mondo reale.

Cosa sto chiedendo: come posso ottenere l'equivalente di un join esterno completo senza scrivere macro? Le formule e tutte le funzioni accessibili tramite la barra multifunzione sono OK.

Un piccolo esempio di "dati di riproduzione":

Foglio 1:

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

Foglio 2:

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

Output desiderato (l'ordinamento non è importante):

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

Per tutti coloro che sono inorriditi da questo scenario: so che questo è il modo sbagliato di farlo. Se potessi scegliere, non userei Excel per questo. Tuttavia, ci sono abbastanza situazioni là fuori dove è necessaria una soluzione pragmatica, stat e una soluzione migliore (dal punto di vista IT) non può essere applicata.


Se ordini entrambi gli elenchi e li metti fianco a fianco, dovrebbe essere abbastanza facile abbinare manualmente la colonna desiderata. Se disponi di molti dati, potresti scrivere una funzione che accetta due intervalli e lo fa per te.
Dan

@Dan come ho detto, lo sto chiedendo senza scrivere una funzione . Nelle situazioni in cui posso scriverlo, la soluzione è banale (almeno per me, perché ho già scritto VBA)
rumtscho

Excel supporta query SQL tramite connessioni dati. Sono terribile, quindi purtroppo non posso offrire molti più consigli, ma potrebbe valere la pena cercarti.
Kyle

@Kyle ho aggiunto questa opzione alla mia risposta. Non è per i deboli di cuore e per questo potrebbe essere un casino da giocare e / o completare eccessivamente ma, ehi, perché no!
Enderland

Risposte:


44

Approccio semplice: operazioni standard di Excel

Innanzitutto, copia / incolla entrambe le colonne chiave da entrambe le tabelle in un singolo foglio nuovo come una singola colonna.

Utilizzare "Rimuovi duplicati" per ottenere l'elenco singolo di tutte le chiavi univoche.

Quindi, aggiungi due colonne (in questo caso), una per ciascuna delle colonne di dati in ciascuna tabella. Ti consiglio di usare anche il formato come opzione tabella in quanto rende le tue formule molto più belle. Utilizzando vlookup, utilizzare la seguente formula:

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

Dove Sheet4!A:Brappresenta qualunque sia la tabella dei dati della tabella di origine per ciascun rispettivo valore. IFERROR impedisce i brutti risultati # N / A che compaiono quando vlookup non ha esito positivo e in questo caso restituisce una cella vuota.

Questo ti dà la tabella risultante.


Sheet3:

inserisci qui la descrizione dell'immagine

Sheet4:

inserisci qui la descrizione dell'immagine

Dati risultato:

inserisci qui la descrizione dell'immagine

Formule dei risultati ( Ctrl+ ~attiva / disattiva):

inserisci qui la descrizione dell'immagine


Query SQL integrata

Puoi anche farlo con la query SQL integrata. È ... molto meno intuitivo, ma forse sarà un caso d'uso migliore. Ciò richiederà probabilmente di aver formattato i dati di "origine" come tabelle.

  1. Fai clic su una cella in un nuovo foglio
  2. Vai a Dati -> Da altre fonti -> Da query Microsoft
  3. Seleziona File Excel * nella scheda Database e premi ok
  4. Seleziona la tua cartella di lavoro
  5. Seleziona i seguenti quattro campi:
    • inserisci qui la descrizione dell'immagine
  6. Fai clic su "Avanti" e "OK" nel bel avvertimento formattato degli anni '90 che vedi
  7. Seguendo queste istruzioni creare il primo Join esterno sinistro. Nel mio caso sto usando la tabella "paesi" come origine sinistra e i "nomi" come destra.
    • inserisci qui la descrizione dell'immagine
    • Questo fornisce solo alcune delle righe (poiché ti unisci all'ID)
  8. La parte "crea un join sottratto e poi aggiungilo come unione" è più complicata.

    • Ecco le configurazioni del join sottratto: inserisci qui la descrizione dell'immagine
    • Copia l'SQL di questo join dal pulsante SQL:
    • SELEZIONA countries$.ID, countries$.Val1, names$.ID, names$. Val2 DA {oj C:\Users\Username\Desktop\Book2.xlsx. countries$ countries$SINISTRA ESTERNO UNISCITI C:\Users\Username\Desktop\Book2.xlsx. names$ names$ON countries$.ID = names$.ID} DOVE ( names$.ID è nullo)

  9. Torna al primo join esterno che hai creato. Modifica manualmente l'SQL e

    • aggiungi Unionin fondo
    • Aggiungi il testo del join sottratto sopra nella parte inferiore del join
  10. Premi il pulsante "Restituisci dati" immediatamente a sinistra del pulsante SQL
    • È possibile che si desideri modificare l'SQL per selezionare solo i dati specifici desiderati a questo punto. Trovo più facile nascondere le colonne nel risultato.
  11. Posizionare la query da qualche parte e confermare la sua posizione
    • inserisci qui la descrizione dell'immagine

Non per i deboli di cuore. Ma se vuoi avere una grande opportunità di vedere alcune parti non aggiornate di Office come potresti essere stato vivo, è una grande opportunità.


1
Hai un riferimento per la notazione [@ID]? Non ho dubbi sul fatto che funzioni, ma non l'ho mai visto prima e faccio molto lavoro in Excel.
TJL

1
@TJL se formatti una tabella come tabella, userà quel tipo di notazione per fare riferimento ad altre colonne. Molto più chiaro dei riferimenti di cella. Potrebbe essere una funzione 2010+? Non ne sono sicuro. Non ho usato la magia della formattazione come tabella abbastanza prima del 2010 ..
Enderland


Non puoi semplicemente cambiare la parola SINISTRA con la parola FULL nella query originale? Sono sicuro che sta solo usando il driver ACE OLEDB per eseguire quella query, che supporta la sintassi FULL JOIN.
Kyle Hale,

14

Come soluzione alternativa, posso suggerire Power Query ? È un componente aggiuntivo gratuito di Excel di Microsoft per eseguire esattamente questo genere di cose. Le sue funzionalità saranno effettivamente incluse direttamente in Excel 2016, quindi sono a prova di futuro.

Ad ogni modo, con Power Query, i passaggi sono piuttosto semplici:

  1. Importa entrambe le tabelle come query in Power Query Editor.
  2. Esegui una trasformazione Query di unione su di esse, impostando la colonna di join appropriata e impostando il tipo di join come Esterno completo.
  3. Carica la tabella dei risultati in un nuovo foglio.

La cosa bella di questo è che una volta impostato, se si apportano modifiche alle tabelle dei dati di base, è sufficiente toccare Dati> Aggiorna tutto e anche il foglio dei risultati di Power Query viene aggiornato.


Molto interessante. Un mio amico che possiede un ristorante mi ha chiesto di MS Office e mi ha mostrato la sua suite del 2016, che non include MS Access. Vedo ora perché è così. Excel aveva molte limitazioni. Non ho mai comprato sopra il 2003 perché nessuna delle caratteristiche era di valore e non mi piaceva nemmeno il nuovo look; 2010 e oltre. Access fa tutto questo e molto altro, quindi si pone la domanda: perché così tante persone stanno provando a fare Database lavorando in Excel quando Access è il modo per raggiungere questo obiettivo? L'unica cosa che posso vedere è che forse per far funzionare un buon DB di Access, ha anche bisogno di una buona esperienza VB.
ejbyte il

@ejbytes la maggior parte delle persone capisce il concetto di fogli di calcolo. La maggior parte ... non capisce il concetto di un database. Avevo un progetto che convertiva un progetto di foglio di calcolo come database in un database e gli utenti lo chiamavano ancora "il foglio di calcolo", anche dopo ampie spiegazioni su come funziona un database!
Enderland,

@enderland Penso che tu abbia ragione. Un foglio di calcolo con regole non rigorose e flessibilità non contigua ... e query mascherate da filtri. Una piattaforma per tabelle ed elenchi make-shift.
ejbyte il

La versione di @ejbytes tldr è che MS voleva testare un motore di memoria columnstore in Excel per far entrare più righe, includeva connessioni esterne ai dati, si è rivelato estremamente popolare, quindi hanno aggiunto uno strumento ETL. Ora hanno arrotolato tutti gli strumenti come PowerBI.
Kyle Hale,

@KyleHale Sto usando Office 2010 e sto provando a fare un JOEN FULL OUTER, ma Power Query ignora gli ID della seconda tabella che non sono nella prima tabella.
GeMir,

0

Un modo rapido per simulare semi-similmente un (join esterno) è prendere il tuo secondo elenco e incollarlo direttamente sotto il tuo elenco di pugno, cioè quindi le tue (chiavi primarie) sono tutte nella stessa colonna (primaria). Quindi ordina quella colonna primaria, finirai con un elenco interfogliato, quindi esegui un'equazione IF trasposta (il superutente sta incasinando la vista del layout della tabella ..):

listA listB


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

copia / incolla / ordina, il risultato è simile al seguente: AB chris green fred blue gustav 047 mary 5710 mary black sam blue tim 32874 tim red

quindi formula per cella c1: (c1) = if (A1 = A2, B2)

il risultato è simile al seguente:

ABC chris green FALSE fred blue FALSE gustav 047 FALSE mary 5710 nero mary nero FALSE sam blu FALSE tim 32874 rosso tim rosso FALSE

Ordina C per eliminare i falsi ecc. Questa è una versione di base dell'idea, basta espanderla se sono necessari più dati. -wag770310


Puoi formattarlo in qualche modo per renderlo leggibile?
davidbaumann il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.