4
respostas

SELECT com LEFT JOIN com sucesso porém alguns resultados errados.

Estou precisando fazer uma SELECT usando 2 TABLES com LEFT JOIN obtenho sucesso na query porém ela me traz algumas COLUMN com resultados errados.

Antes de publicar a query com LEFT JOIN vou mostrar os resultados que deveriam vir separadamente:

tbCustosProd

select ManuPart, 
        sum(Qtd), 
        avg(CustoUnit), 
        sum(CustoTotal) 
from tbCustosProd 
where ManuPart='RC 018'

ManuPart----sum(Qtd)----avg(ValorUnit)----sum(ValorTotal)  
---RC 018----------164--------------10.214-------------1694.81------



+++++++++++++++++++++++++++++++++++++++++++++++++++++


**tbEntregas**  
select ManuPart, 
        sum(Qtd), 
        avg(ValorUnit), 
        sum(ValorTotal) 
from tbEntregas 
where Qtd > 0 and ManuPart='RC 018';

ManuPart----sum(Qtd)----avg(CustoUnit)----sum(CustoTotal)  
---RC 018----------258--------------18.768-------------4939.70-------

Usei como exemplo um determinado item: RC 018 apenas para termos como parametro a diferença nos resultados; tbCustosProd e tbEntregas são as tabelas,

segue a Query com LEFT JOIN:

select entregas.ManuPart, 
                sum(entregas.Qtd), 
                avg(entregas.ValorUnit), 
                sum(entregas.ValorTotal), 
                sum(custos.Qtd), 
                avg(custos.CustoUnit), 
                sum(custos.CustoTotal)
from tbEntregas entregas left join tbCustosProd custos 
on custos.ManuPart = entregas.ManuPart
group by ManuPart;

Aqui não uso uma condição para o ManuPart pois quero buscar todos os itens da tbEntregas; porém a ROW que representa o item acima (RC 018) voltar com os seguintes resultados:

entregas.ManuPart = RC 018 certo.

Sum(entregas.Qtd) = 2322 errado

avg(entregas.ValorUnit) = 18.768 certo

sum(entregas.ValorTotal) = 44457.30 errado

sum(custos.Qtd) = 7052 errado

avg(custos.CustoUnit) = 10.214 certo

sum(custos.CustoTotal) = 72876.83 errado

Comparando com as Query individuais lá em cima você pode ver as COLUMNS com os resultados divergentes.

Não consigo encontrar a forma certa de formar essa Query, alguém pode me ajudar ?

4 respostas

Pelo que percebi, fazendo alguns teste a Query está multiplicando o as colunas com a ferramente (SUM()) pela quantidade de registros que cada ManuPart contem em cada planilha , por ex:

sum(entregas.Qtd) * Count(custos.Id where ManuPart= entregas.ManuPart) = 2322

sum(entregas.ValorTotal) * Count(custos.Id where ManuPart= entregas.ManuPart) = 44457.30

sum(custos.Qtd) * Count(entregas.Id where ManuPart= entregas.ManuPart) = 7052

sum(custos.CustoTotal) * Count(entregas.Id where ManuPart= entregas.ManuPart) = 72876.83

Fala ai Mauricio, de boa ?

Cara vi que sua dúvida tá aberta faz um tempo, conseguiu soluciona-la ? Se sim compartilha conosco o que aprendeu ?

Fala Maurício, td bem?

vc falou que ele está multiplicando os registros: "Pelo que percebi, fazendo alguns teste a Query está multiplicando o as colunas com a ferramente (SUM()) pela quantidade de registros que cada ManuPart contem em cada planilha , por ex:"

Deve estar faltando algum campo no left join, quando isso acontece o banco traz um registro da primeira tabela para cada registro da segunda, multiplicando os resultados.

Para ajudar a achar o problema, filtra um registro que está com valor errado na primeira tabela e mandar exibir todos os campos, assim vc vai ver as linhas da segunda tabela duplicadas e identificar se tem mais algum campo para incluir no join.

Opa Mauricio, por que esse precisa ser um left join e não um inner join? Lembra que o sum vai somar todos os resultados encontrados tanto que são comuns as duas tabelas, quanto aos que não são. É assim mesmo?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software