Problema com junção de tabelas
Olá Pessoal,
Estou fazendo um banco de dados onde possuo uma tabela de Cadastro dos Caminhões(id_caminhao, id_motorista, tipo), uma de Abastecimentos(id_abastecimento, id_caminhao, posto, valor) e outra de Serviços(id_servico, id_caminhao, valor_serv).
Quando faço junção dessas tabelas, por exemplo:
Vou somar os valores em comuns que possuo nessas tabelas, mas quando eu faço a junção, o valor da tabela serviço está vindo duplicado.
Estou usando:[code] select sum(s.valor_ser), sum(a.valor) from caminhao c, abastecimentos a, servicos s where c.id_caminhao = a.id_caminhao and s.id_caminhao = c.id_caminhao [code]
Como abastecimento tem o registro de um caminhão duas vezes, ele consegue fazer a soma e me dar o valor total gasto por aquele caminhão... mas o resultado do serviço aparece duplicado, como se ele tivesse feito isto para cada registro do abastecimento.
Como faço para fazer uma soma em uma tabela e depois fazer junção com outra tabela sem duplicar o dado?
Já tentei todos os tipos de join. Não sei se vou precisar de subquerie.
Agradeço a ajuda.
Obrigada :)
Estou fazendo um banco de dados onde possuo uma tabela de Cadastro dos Caminhões(id_caminhao, id_motorista, tipo), uma de Abastecimentos(id_abastecimento, id_caminhao, posto, valor) e outra de Serviços(id_servico, id_caminhao, valor_serv).
Quando faço junção dessas tabelas, por exemplo:
Vou somar os valores em comuns que possuo nessas tabelas, mas quando eu faço a junção, o valor da tabela serviço está vindo duplicado.
Estou usando:[code] select sum(s.valor_ser), sum(a.valor) from caminhao c, abastecimentos a, servicos s where c.id_caminhao = a.id_caminhao and s.id_caminhao = c.id_caminhao [code]
Como abastecimento tem o registro de um caminhão duas vezes, ele consegue fazer a soma e me dar o valor total gasto por aquele caminhão... mas o resultado do serviço aparece duplicado, como se ele tivesse feito isto para cada registro do abastecimento.
Como faço para fazer uma soma em uma tabela e depois fazer junção com outra tabela sem duplicar o dado?
Já tentei todos os tipos de join. Não sei se vou precisar de subquerie.
Agradeço a ajuda.
Obrigada :)
Ludmila Campos
Curtidas 0
Respostas
Wilson Junior
09/09/2010
Teste assim:
Espero ter colaborado.
SELECT SUM( s.Valor_Ser ), SUM( a.Valor ) FROM CAMINHAO c LEFT OUTER JOIN ABASTECIMENTOS a ON (a.ID_Caminhao = c.ID_Caminhao) LEFT OUTER JOIN SERVICOS s ON (s.ID_Caminhao = c.ID_Caminhao)
Espero ter colaborado.
GOSTEI 0
Eriley Barbosa
09/09/2010
Não é falta de um group by
SELECT
c.ID_Caminhao,
SUM( s.Valor_Ser ),
SUM( a.Valor )
FROM
CAMINHAO c
LEFT OUTER JOIN ABASTECIMENTOS a ON (a.ID_Caminhao = c.ID_Caminhao)
LEFT OUTER JOIN SERVICOS s ON (s.ID_Caminhao = c.ID_Caminhao) group by c.ID_Caminhao
SUM( s.Valor_Ser ),
SUM( a.Valor )
FROM
CAMINHAO c
LEFT OUTER JOIN ABASTECIMENTOS a ON (a.ID_Caminhao = c.ID_Caminhao)
LEFT OUTER JOIN SERVICOS s ON (s.ID_Caminhao = c.ID_Caminhao) group by c.ID_Caminhao
GOSTEI 0
Ludmila Campos
09/09/2010
Id_abastecimento
Id_caminhao
Posto
Valor
1
3
Real
1200
2
3
Auto-posto
200
3
2
Real
100
Tabela Abastecimento
Tabela Caminhão
Id_caminhao
Tipo_Caminhao
1
Bitrem
2
Teste
3
Teste2
Tabela Serviços
Id_abastecimento
Id_caminhao
Valor_serv
1
3
45.87
2
4
10.00
3
3
40.00
Essas são as minhas tabelas com os dados... quanto eu faço o tipo de junção que vocês me passaram, ele está duplicando o valor dos serviços para o caminhão de código 3
GOSTEI 0
Wilson Junior
09/09/2010
Com base no seu exemplo no post anterior, quais são os valores retornados do SQL e qual o SQL que você está executando?
Aguardo retorno.
Aguardo retorno.
GOSTEI 0
Eriley Barbosa
09/09/2010
SELECT
c.ID_Caminhao,
c.Tipo_Caminhao, SUM( s.Valor_Ser ),
SUM( a.Valor )
FROM
CAMINHAO c,
ABASTECIMENTOS a, SERVICOS s where a.ID_Caminhao = c.ID_Caminhao
and s.ID_Caminhao = c.ID_Caminhao and a.Id_abastecimento = s.Id_abastecimento and a.ID_Caminhao = s.ID_Caminhao group by c.ID_Caminhao, c.Tipo_Caminhao
c.Tipo_Caminhao, SUM( s.Valor_Ser ),
SUM( a.Valor )
FROM
CAMINHAO c,
ABASTECIMENTOS a, SERVICOS s where a.ID_Caminhao = c.ID_Caminhao
and s.ID_Caminhao = c.ID_Caminhao and a.Id_abastecimento = s.Id_abastecimento and a.ID_Caminhao = s.ID_Caminhao group by c.ID_Caminhao, c.Tipo_Caminhao
Id_abastecimento
Id_caminhao
Posto
Valor
1
3
Real
1200
2
3
Auto-posto
200
3
2
Real
100
Tabela Abastecimento
Tabela Caminhão
Id_caminhao
Tipo_Caminhao
1
Bitrem
2
Teste
3
Teste2
Tabela Serviços
Id_abastecimento
Id_caminhao
Valor_serv
1
3
45.87
2
4
10.00
3
3
40.00
Essas são as minhas tabelas com os dados... quanto eu faço o tipo de junção que vocês me passaram, ele está duplicando o valor dos serviços para o caminhão de código 3
GOSTEI 0
Ludmila Campos
09/09/2010
Ainda não deu... e coloquei um dado errado na tabela anterior.
A tabela serviço é
Eu estou utilizando o Mysql Administrator para fazer as tabelas. Os campos de valores já tentei fazer decimal (10,2), do tipo double.. mas o dado do caminhão de ID 3 está alterado.
Como mostra o exemplo anterior, se eu preciso somar os serviços do id 3, então o resultado era para dar 84.87 e está duplicando este valor.
Segue a imagem com o resultado da pesquisa.... fazendo a correção da tabela serviço e olha como ele está duplicando os valores dos resultados... era para dar no id_caminhao SUM_Valor_serv 84.87 e do Valor (abastecimento) 1400.
Já tentei várias queries... separando os selects... funciona.. mas quando tento visualizar tudo em um select... ele está duplicando os dados.
Aguardo retorno....
Obrigada :)
A tabela serviço é
Id_servico, id_caminhao e valor_serv
Eu estou utilizando o Mysql Administrator para fazer as tabelas. Os campos de valores já tentei fazer decimal (10,2), do tipo double.. mas o dado do caminhão de ID 3 está alterado.
Como mostra o exemplo anterior, se eu preciso somar os serviços do id 3, então o resultado era para dar 84.87 e está duplicando este valor.
Segue a imagem com o resultado da pesquisa.... fazendo a correção da tabela serviço e olha como ele está duplicando os valores dos resultados... era para dar no id_caminhao SUM_Valor_serv 84.87 e do Valor (abastecimento) 1400.
Já tentei várias queries... separando os selects... funciona.. mas quando tento visualizar tudo em um select... ele está duplicando os dados.
Aguardo retorno....
Obrigada :)
GOSTEI 0
Wilson Junior
09/09/2010
Teste assim:
Espero ter colabroado.
SELECT c.ID_Caminhao, ( SELECT SUM( s.Valor_Ser ) FROM SERVICOS s WHERE s.ID_Caminhao = c.ID_Caminhao ) AS ValorServ, ( SELECT SUM( a.Valor ) FROM ABASTECIMENTOS a WHERE a.ID_Caminhao = c.ID_Caminhao ) AS ValorAbast FROM CAMINHAO c
Espero ter colabroado.
GOSTEI 0
Wilson Junior
09/09/2010
Teste assim:
Espero ter colaborado.
SELECT c.ID_Caminhao, ( SELECT SUM( s.Valor_Ser ) FROM SERVICOS s WHERE s.ID_Caminhao = c.ID_Caminhao ) AS ValorServ, ( SELECT SUM( a.Valor ) FROM ABASTECIMENTOS a WHERE a.ID_Caminhao = c.ID_Caminhao ) AS ValorAbast FROM CAMINHAO c
Espero ter colaborado.
GOSTEI 0
Ludmila Campos
09/09/2010
Agora sim...
Muito obrigada Wilson... vc salvou minha vida...rs...rs.rs
[]s,
Até ++
Muito obrigada Wilson... vc salvou minha vida...rs...rs.rs
[]s,
Até ++
GOSTEI 0
José
09/09/2010
Duvida inicial solucionada, estou marcando este tópico como concluído.
GOSTEI 0