Como simular uma junção externa completa no Excel?


34

Vamos supor que eu tenha alguns dados no Excel (e não em um banco de dados real). Em uma planilha, tenho dados, nos quais uma coluna funciona como o ID, e verifiquei se os valores nessa coluna são únicos. Em outra planilha, também tenho alguns dados, novamente com uma coluna que pode ser usada como um ID e também é único. Se a linha N na Planilha 1 tiver algum valor e a linha M na Planilha 2 tiver o mesmo valor, tenho certeza de que as linhas N e M descrevem o mesmo objeto do mundo real.

O que estou perguntando: como posso obter o equivalente a uma associação externa completa sem gravar nenhuma macro? Fórmulas e todas as funções acessíveis através da faixa de opções estão OK.

Um pequeno exemplo de "reproduzir dados":

Folha 1:

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

Folha 2:

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

Saída desejada (a classificação não é 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

Para todo mundo que está horrorizado com esse cenário: eu sei que esse é o caminho errado para fazê-lo. Se eu tiver alguma escolha, não usaria o Excel para isso. No entanto, existem situações suficientes por aí em que é necessária uma solução pragmática, stat e uma solução melhor (do ponto de vista de TI) não pode ser aplicada.


Se você classificar as duas listas e colocá-las lado a lado, deve ser bastante fácil corresponder manualmente a coluna desejada. Se você tiver muitos dados, poderá escrever uma função que aceite dois intervalos e faça isso por você.
Dan

@ Dan, como eu disse, estou pedindo para fazer isso sem escrever uma função . Em situações em que eu posso escrever isso, a solução é trivial (pelo menos para mim, porque eu tenho escrito VBA antes)
rumtscho

O Excel suporta consultas SQL por meio de conexões de dados. Como sou péssima, infelizmente não posso oferecer muito mais conselhos, mas vale a pena procurar por você.
Kyle

@ Kyle eu adicionei essa opção à minha resposta. Não é para os fracos de coração e para isso pode ser uma bagunça de brincar e / ou completo exagero, mas ei, por que não!
Enderland

Respostas:


44

Abordagem fácil - operações padrão do Excel

Primeiro, copie / cole as duas colunas principais de ambas as tabelas em uma única planilha nova como uma única coluna.

Use o botão "Remover duplicatas" para obter a lista única de todas as suas chaves exclusivas.

Em seguida, adicione duas colunas (nesse caso), uma para cada uma das suas colunas de dados em cada tabela. Eu recomendo que você use o formato como opção de tabela também, pois torna suas fórmulas muito mais agradáveis. Usando vlookup, use a seguinte fórmula:

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

Onde Sheet4!A:Brepresenta qualquer que seja a tabela de dados da tabela de origem para cada valor respectivo. O IFERROR evita os feios # N / A resultados que aparecem quando o vlookup não é bem-sucedido e, nesse caso, retornam uma célula em branco.

Isso fornece sua tabela resultante.


Folha3:

insira a descrição da imagem aqui

Folha4:

insira a descrição da imagem aqui

Dados do resultado:

insira a descrição da imagem aqui

Fórmulas de resultado ( Ctrl+ ~alternará isso):

insira a descrição da imagem aqui


Consulta SQL integrada

Você também pode fazer isso com a consulta SQL interna. É ... muito menos amigável, mas talvez seja um caso de uso melhor. Isso provavelmente exigirá que você tenha formatado seus dados de "origem" como tabelas.

  1. Clique em uma célula em uma nova planilha
  2. Vá para Dados -> De Outras Fontes -> Da Microsoft Query
  3. Selecione Arquivos do Excel * na guia Bancos de dados e pressione ok
  4. Selecione sua pasta de trabalho
  5. Selecione os quatro campos a seguir:
    • insira a descrição da imagem aqui
  6. Clique em "próximo" e "ok" no belo aviso formatado dos anos 90 que você vê
  7. Seguindo estas instruções, crie a primeira junção externa esquerda. No meu caso, estou usando a tabela "países" como a fonte esquerda e os "nomes" como a direita.
    • insira a descrição da imagem aqui
    • Isso fornece apenas algumas das linhas (desde que você ingressou no ID)
  8. A parte "criar uma junção de subtração e depois adicioná-la como união" é mais complicada.

    • Aqui estão as configurações de junção de subtração: insira a descrição da imagem aqui
    • Copie o SQL desta junção do botão SQL:
    • SELECT countries$.ID, countries$.Val1, names$.ID names$,. Val2 FROM {oj C:\Users\Username\Desktop\Book2.xlsx. countries$ countries$JUNTA EXTERIOR ESQUERDA C:\Users\Username\Desktop\Book2.xlsx. names$ names$ON countries$.ID = names$.ID} ONDE ( names$.ID É Nulo)

  9. Volte para a primeira junção externa que você criou. Edite manualmente o SQL e

    • adicione Unionao fundo
    • Adicione o texto da junção de subtração acima na parte inferior da junção
  10. Clique no botão "Return Data" imediatamente à esquerda do botão SQL
    • Você pode editar o SQL para selecionar apenas os dados específicos que você deseja neste momento. Acho mais fácil ocultar colunas no resultado.
  11. Coloque a consulta em algum lugar e confirme sua localização
    • insira a descrição da imagem aqui

Não para os fracos de coração. Mas se você deseja uma ótima chance de ver partes do Office não atualizadas, desde que você esteja vivo, é uma ótima chance.


1
Você tem uma referência para a notação [@ID]? Não duvido que funcione, mas nunca o vi antes e faço muito trabalho no Excel.
TJL 07/01

1
@TJL, se você formatar uma tabela como tabela, usará esse tipo de notação para referenciar outras colunas. Muito mais claro que as referências às células. Pode ser um recurso de 2010 ou superior? Não tenho certeza. Eu não usar a magia de formatação como tabela suficiente anteriores a 2010 ..
enderland


Você não pode simplesmente alterar a palavra ESQUERDA para a palavra CHEIO na consulta original? Tenho certeza de que está apenas usando o driver ACE OLEDB para executar essa consulta, que suporta a sintaxe FULL JOIN.
Kyle Hale

14

Como uma solução alternativa, posso sugerir o Power Query ? É um suplemento gratuito do Excel da Microsoft para basicamente executar exatamente esse tipo de coisa. Sua funcionalidade também será incluída diretamente no Excel 2016, portanto, é protegida contra o futuro.

De qualquer forma, com o Power Query, as etapas são bem simples:

  1. Importe ambas as tabelas como consultas para o Power Query Editor.
  2. Execute uma transformação de Mesclar Consultas neles, configurando a coluna de junção apropriada e definindo o tipo de junção como Full Outer.
  3. Carregue sua tabela de resultados em uma nova planilha.

O bom disso é que, depois de configurá-lo, se você fizer alterações nas tabelas de dados básicas, basta clicar em Dados> Atualizar tudo e a planilha de resultados do Power Query também será atualizada.


Muito interessante. Um amigo meu, dono de um restaurante, estava me perguntando sobre o MS Office e me mostrou sua suíte de 2016, que não inclui o MS Access. Eu vejo agora porque é isso. O Excel tinha muitas limitações. Nunca comprei acima de 2003 porque nenhum dos recursos tinha valor e também não gostei do novo visual; 2010 e acima. O Access faz tudo isso e muito mais, então ele levanta a questão: por que tantas pessoas estão tentando fazer com que o Banco de Dados funcione no Excel quando o Access é a maneira de conseguir isso? A única coisa que posso ver é que, para obter um bom banco de dados do Access, ele também precisa de uma boa experiência em VB.
ejbytes

@ejbytes A maioria das pessoas entende o conceito de planilhas. A maioria ... não entende o conceito de banco de dados. Eu tinha um projeto convertendo um projeto de planilha como banco de dados em um banco de dados e os usuários ainda a chamavam de "planilha" - mesmo depois de explicações extensivas sobre como um banco de dados funciona!
Enderland

@enderland Eu acho que você está certo. Uma planilha com regras não rigorosas e flexibilidade não contígua ... e consultas disfarçadas de filtros. Uma plataforma para tabelas e listas improvisadas.
ejbytes

A versão do @ejbytes tldr é que a MS queria testar um mecanismo de memória columnstore no Excel para permitir mais linhas, incluía conexões de dados externas, provou ser muito popular e, portanto, elas adicionaram uma ferramenta ETL. Agora eles lançaram todas as ferramentas como PowerBI.
Kyle Hale

@KyleHale Estou usando o Office 2010 e tentando fazer uma JOGO EXTERIOR COMPLETO, mas o Power Query ignora IDs da segunda tabela que não estão na primeira tabela.
GeMir

0

Uma maneira rápida de semi-simular uma (junção externa) é pegar sua segunda lista e colá-la diretamente abaixo da sua lista principal, ou seja, para que suas (chaves primárias) estejam todas na mesma coluna (primária). Em seguida, classifique a coluna principal, você terminará com uma lista intercalada e fará uma equação IF transposta (o superusuário está atrapalhando a exibição do layout da tabela ..):

listA listB


sam azul tim 32874 tim vermelho mary 5710 chris verde gustav 047 fred azul
mary preto

copiar / colar / classificar, o resultado fica assim: AB chris verde fred azul gustav 047 mary 5710 mary preto sam azul tim 32874 tim vermelho

então fórmula para a célula c1: (c1) = if (A1 = A2, B2)

resultado é assim:

ABC chris green FALSE fred blue FALSE gustav 047 FALSE mary 5710 black mary black FALSE sam azul FALSO tim 32874 vermelho tim vermelho FALSO

Classifique C para se livrar de falsas, etc. Essa é uma versão básica da idéia, apenas expanda-a se mais dados forem necessários. -wag770310


Você pode formatar isso de alguma maneira para torná-lo legível?
davidbaumann 13/11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.