FULL OUTER JOIN em Consultas no Excel

Fórum para dúvidas sobre os fundamentos da linguagem de programação Visual Basic no contexto do VBA

FULL OUTER JOIN em Consultas no Excel

Mensagempor Dhony Silva » Dom Jun 17, 2012 4:52 pm

Senhores, Boa tarde.

Estou tentando refinar uma consulta usando duas Planilhas do Excel como Banco de Dados.

O que preciso é juntar as as Turmas de uma Gerencia, trazendo a quantidade de HorasPlanejadas e a quantidade de HorasDisponíveis.
A quatidade de horas Planejadas está em uma Sheet e as HorasDisponíveis em outra Sheet no mesmo arquivo.

Consegui fazer isso usando a seguinte instrução no VBA:

Código: Selecionar todos
SELECT [TGerencia$].Gerencia, [TGerencia$].Turma, [TGerencia$].HorasPlanejadas, [THorasDisponivel$].HorasDisponivel
FROM [TGerencia$]
INNER JOIN [HorasDisponivel$]
ON [TGerencia$].Turma = [HorasDisponivel$].Turma


Resultado é:

Gerencia | Turma | HorasPlanejadas | HorasDisponivel
GER1 TA-01 100 90
GER1 TA-02 98 70
GER1 TA-03 26 63
GER1 TA-03 40 11
GER2 TO-01 40 90
GER2 TO-02 98 70
GER2 TO-03 26 63
GER2 TO-03 40 11

Observem que obtive um panorama interessante sobre como anda o planejamento de cada turma.

Acontece que com essa instrução, o SQl só me retorna as Turmas que têm HorasPlanejadas e HorasDisponiveis. Nesse caso eu preciso ver também as Turmas que têm

HorasPlanejadas e não têm HorasDisponiveis

e o inverso

HorasDisponiveis e não tem HorasPlanejada

Em outros bancos de dados, poderíamos utilizar o FULL JOIN para trazer os dados da tabela da esquerda (left join) e os da tabela direita (right join) mesmo que uma ou outra estiver vazia. Pesquisei bastante e me parece que o Excel em seu provedor Jet não oferece suporte a instrução FULL JOIN.

Algém já passou por isso e encontrou uma solução?

Grato
Dhony Silva
Aprendiz de VBA
http://devds.wordpress.com
Dhony Silva
 
Mensagens: 15
Registrado em: Dom Jun 17, 2012 4:27 pm
Agradecimentos dados: 2 vezes
Agradecimentos recebidos: 2 vezes

Re: FULL OUTER JOIN em Consultas no Excel

Mensagempor webmaster » Seg Jun 18, 2012 5:50 pm

Dhony,

Até então não tive problemas com OUTER JOIN no provedor Jet, mas se a fonte de dados for uma arquivo Excel, acredito que o problema seja que a célula não contém o valor NULL, que caracteriza a operação.

Neste caso, monte o OUTER JOIN no WHERE prevendo as condições necessárias (NULL, Vazio, aspas vazias, etc). Dessa forma, acredito que não terá problemas.

Abraços
Tomás
http://www.tomasvasquez.com.br/blog
http://twitter.com/tomamais
Gostou da resposta? Clique no ícone Imagem da mensagem!
Se sua dúvida foi solucionada, acrescente [RESOLVIDO] ao título.
Avatar do usuário
webmaster
Administrador
 
Mensagens: 1722
Registrado em: Sex Jul 24, 2009 2:44 pm
Agradecimentos dados: 104 vezes
Agradecimentos recebidos: 77 vezes

Re: FULL OUTER JOIN em Consultas no Excel

Mensagempor Dhony Silva » Seg Jun 18, 2012 7:56 pm

Tomas,

a fonte de dados é um arquivo Excel.

O que estou precisando é montar uma instrução que traga resultados de duas tabelas (planilhas) mesmo que que a da direita ou da esquerda não tenha valores.
Em outros sistemas ou fontes de dados, utilizaria o comando FULL JOIN http://www.w3schools.com/sql/sql_join_full.asp

Da forma como pensei, ficaria assim
Código: Selecionar todos
SELECT [TGerencia$].Gerencia, [TGerencia$].Turma, [TGerencia$].HorasPlanejadas, [THorasDisponivel$].HorasDisponivel
FROM [TGerencia$]
FULL JOIN [HorasDisponivel$]
ON [TGerencia$].Turma = [HorasDisponivel$].Turma


porém o FULL JOIN não funciona no Excel.
Dhony Silva
Aprendiz de VBA
http://devds.wordpress.com
Dhony Silva
 
Mensagens: 15
Registrado em: Dom Jun 17, 2012 4:27 pm
Agradecimentos dados: 2 vezes
Agradecimentos recebidos: 2 vezes

Re: FULL OUTER JOIN em Consultas no Excel

Mensagempor webmaster » Ter Jun 19, 2012 11:58 am

Dhony,

Se entendi direito, FULL JOIN (nunca usei) é idem a fazer um plano cartesiano das tabelas. Então, acho que isso deve resolver:

Código: Selecionar todos
SELECT [TGerencia$].Gerencia, [TGerencia$].Turma, [TGerencia$].HorasPlanejadas, [THorasDisponivel$].HorasDisponivel
    FROM [TGerencia$], [HorasDisponivel$]
    WHERE [TGerencia$].Turma = [HorasDisponivel$].Turma


Teste e diga se funcionou.

Abraços
Tomás
http://www.tomasvasquez.com.br/blog
http://twitter.com/tomamais
Gostou da resposta? Clique no ícone Imagem da mensagem!
Se sua dúvida foi solucionada, acrescente [RESOLVIDO] ao título.

O autor desta mensagem webmaster foi agradecido por:
Dhony Silva (Qui Jun 21, 2012 2:45 pm)
Qualificação: 20%
 
Avatar do usuário
webmaster
Administrador
 
Mensagens: 1722
Registrado em: Sex Jul 24, 2009 2:44 pm
Agradecimentos dados: 104 vezes
Agradecimentos recebidos: 77 vezes

Re: FULL OUTER JOIN em Consultas no Excel

Mensagempor Ricfwolff » Qui Jun 21, 2012 10:34 am

Opa!

Webmaster, o que você falou (plano cartesiano) seria um CROSS join, e não um FULL. O Full compara os resultados e traz os "not-matched" dos dois lados do select. E o select que você mandou representa um inner join.

Dhony,

Talvez o que você precise seja um Union do Right com o Left... Mas nunca fiz isso com excel:

Código: Selecionar todos
SELECT [TGerencia$].Gerencia, [TGerencia$].Turma, [TGerencia$].HorasPlanejadas, [THorasDisponivel$].HorasDisponivel
FROM [TGerencia$]
LEFT OUTER JOIN [HorasDisponivel$]
ON [TGerencia$].Turma = [HorasDisponivel$].Turma
UNION
SELECT [TGerencia$].Gerencia, [TGerencia$].Turma, [TGerencia$].HorasPlanejadas, [THorasDisponivel$].HorasDisponivel
FROM [TGerencia$]
RIGHT OUTER JOIN [HorasDisponivel$]
ON [TGerencia$].Turma = [HorasDisponivel$].Turma


Testa aí e vê se funciona... :)

O autor desta mensagem Ricfwolff foi agradecido por: 2
Dhony Silva (Qui Jun 21, 2012 2:45 pm), webmaster (Qui Jun 21, 2012 12:38 pm)
Qualificação: 40%
 
Ricfwolff
 
Mensagens: 4
Registrado em: Qui Jun 21, 2012 10:24 am
Agradecimentos dados: 1 vez
Agradecimentos recebidos: 2 vezes

Re: FULL OUTER JOIN em Consultas no Excel

Mensagempor webmaster » Qui Jun 21, 2012 12:37 pm

Valeu Ricfwolff!

Vivendo e aprendendo. Vamos esperar o colega Dhony se manifestar quanto ao código.

Abraços
Tomás
http://www.tomasvasquez.com.br/blog
http://twitter.com/tomamais
Gostou da resposta? Clique no ícone Imagem da mensagem!
Se sua dúvida foi solucionada, acrescente [RESOLVIDO] ao título.
Avatar do usuário
webmaster
Administrador
 
Mensagens: 1722
Registrado em: Sex Jul 24, 2009 2:44 pm
Agradecimentos dados: 104 vezes
Agradecimentos recebidos: 77 vezes

Re: FULL OUTER JOIN em Consultas no Excel

Mensagempor Dhony Silva » Qui Jun 21, 2012 2:25 pm

@Ricfwolff,

é justamente o que eu preciso. Já tenho feito o Union do Right com Left e o comportamento é o mesmo do Inner Join. Vou fazer alguns outros testes pra ver se funciona.

@Tomas, estava nesse exato momento escrevendo a continuação dessa nossa conversa, recordando algumas imagens pra melhor ilustrar a dúvida.
A sua sugestão é realmente um INNER JOIN.

Já retorno com a resposta se funcionou.


@Ricfwolff e @Tomas, de já, muito obrigado.
Dhony Silva
Aprendiz de VBA
http://devds.wordpress.com
Dhony Silva
 
Mensagens: 15
Registrado em: Dom Jun 17, 2012 4:27 pm
Agradecimentos dados: 2 vezes
Agradecimentos recebidos: 2 vezes

Re: FULL OUTER JOIN em Consultas no Excel

Mensagempor Dhony Silva » Qui Jun 21, 2012 2:43 pm

Senhores, dando continuidade a nossa conversa,

o que eu preciso que consulta me traga são todas as turmas, mesmo que ela não tenha HorasPlanejadas ou HorasDispinivel como na figura abaixo:
Imagem

Observem que algumas Turmas tem HorasPlanejadas e não tem HorasDisponivel.
Outras são o contrário: tem HorasDisponível e não tem HorasPlanejadas.

As consultas que tenho gerado até o momento não retornam a Turma caso falte o valor em uma das colunas, como abaixo:
Imagem

observem que a query não trouxe as Turmas TA04, TA07, TA09, TO03 e TO07 porque elas não tem HorasPlanejadas ou HorasDispinivel.

Muito obrigado,
Dhony Silva
Aprendiz de VBA
http://devds.wordpress.com
Dhony Silva
 
Mensagens: 15
Registrado em: Dom Jun 17, 2012 4:27 pm
Agradecimentos dados: 2 vezes
Agradecimentos recebidos: 2 vezes

Re: FULL OUTER JOIN em Consultas no Excel

Mensagempor Ricfwolff » Qui Jun 21, 2012 2:55 pm

Qual o resultado que essa consulta traz?

Código: Selecionar todos
SELECT [TGerencia$].Gerencia, [TGerencia$].Turma, [TGerencia$].HorasPlanejadas, [THorasDisponivel$].HorasDisponivel
FROM [TGerencia$]
LEFT JOIN [HorasDisponivel$]
ON [TGerencia$].Turma = [HorasDisponivel$].Turma
Ricfwolff
 
Mensagens: 4
Registrado em: Qui Jun 21, 2012 10:24 am
Agradecimentos dados: 1 vez
Agradecimentos recebidos: 2 vezes

Re: FULL OUTER JOIN em Consultas no Excel

Mensagempor Dhony Silva » Qui Jun 21, 2012 3:02 pm

Traz as Turmas que tenham HorasPlanejadas e não tenham HorasDisponivel.

Já o contrário ela não traz.
Dhony Silva
Aprendiz de VBA
http://devds.wordpress.com
Dhony Silva
 
Mensagens: 15
Registrado em: Dom Jun 17, 2012 4:27 pm
Agradecimentos dados: 2 vezes
Agradecimentos recebidos: 2 vezes

Anúncios

Próximo

Voltar para VBA Básico

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes