Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Duplicação de resultados usando SUM e JOIN

Olá pessoal, estou realizando uma operação no mysql que está duplicando os resultados finais.

Possuo 2 tabelas: * tb_rotas_teste com estrutura simples de:

1- id
2- id_carro
3- distancia

Com preenchimento dos seguintes dados:

id  id_carro  distancia
1     31        0.4
2      20        0.5
3      25        2.5
4      25        4.5
5      21        10.0
6      20        20.0

*tb_abastecimento_teste com estrutura de:

1-id
2-id_carro
3-valor

Com o preenchimento dos seguintes dados:

id  id_carro   valor
1     25         45.00
2      20        30.00
3      28       100.00
4      20        25.00
5      31        22.00
6      20        10.00

A operação que quero fazer é juntar o total de distancia percorrida na tabela de rotas, comparando com total do valor em abastecimento e agrupar isso pelo id_carro.

Para isso, usei a query

SELECT r.id_carro,ROUND(SUM(r.distancia),2) as distancia, ROUND(SUM(a.valor),2) as valor from tb_rotas_teste r left join tb_abastecimento_teste a on a.id_carro = r.id_carro group by r.id_carro

Mas, como resultado eu tive o resultado:

id_carro  valor      distancia
20        130.00        61.50
21          NULL        10.00
25         90.00          7.0
31          22.0         0.40

Analisando apenas pelo id_carro = 20, o resultado final para o valor ficou em 130.00 mas era para ter ficado em 65.00, ou seja, duplicou este valor. A distancia ficou em 61.50, mas era para ter ficado em 20.5, ou seja, triplicou.

OBS: usei left join, pois terão alguns carros que já terão distância preenchido e não terão ainda o valor do abastecimento.

Porque está ocorrendo esses valores divergentes no resultado ? Obrigado pela atenção.

3 respostas

Oi Diego, quando você faz o join o que acontece é que o banco de dados vai "multiplicar" as linhas de uma tabela pelas linhas da outra. Pegando o caso do id=20. O resultado final, resumido, seria assim:

id   distancia valor
20    0.5          30
20    0.5          25
20    0.5          10
20    20           30
20    20           25
20    20           10

Então quando você faz o sum aparece o resultado que você está mencionando. Acho que nesse caso o melhor é jogar tudo para uma tabela só mesmo. Ou fazer 2 queries.

Diego, você tem um problema no seu modelo. Você tem um relacionamento de muitos para muitos. Na tabela 1 você tem dois registro com id_carro = 20. Na tabela 2 também. Logo, para cada linha na tabela 1, a query vai encontrar duas correspondências na segunda tabela, obtendo assim uma razão de 2*2, retornando 4 registro. Como você está agrupando as informações você não consegue observar o problema com clareza. Esse é o perigo do sql, ele não dá erro, só trás o resultado errado.

Ou você corrige o modelo ou com esse modelo você pode fazer uma view inline na query

SELECT 
 r.id_carro,ROUND(SUM(r.distancia),2) as distancia
 , ROUND(SUM(a.valor),2) as valor 
from 
 tb_rotas_teste r 
left join 
(
select
 id_carro
 ,sum(valor) valor
from
 tb_abastecimento_teste
group by
 id_carro
) a 
on 
 a.id_carro = r.id_carro 
group by 
 r.id_carro;
solução!

Fábio,

da forma como você colocou, arrumou a distância, mas o valor continuou dobrando. A solução que achei neste caso foi executar duas queries mesmo já que não posso mudar a estrutura da tabela, devido aos outros dados.

Obrigado pela ajuda!