Fórum Problema com junção de tabelas #385907

09/09/2010

0

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 :)




Ludmila Campos

Ludmila Campos

Responder

Posts

09/09/2010

Wilson Junior

Teste assim:
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.
Responder

Gostei + 0

09/09/2010

Eriley Barbosa

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
Responder

Gostei + 0

09/09/2010

Ludmila Campos

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
Responder

Gostei + 0

10/09/2010

Wilson Junior

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.
Responder

Gostei + 0

10/09/2010

Eriley Barbosa

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
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
Responder

Gostei + 0

10/09/2010

Ludmila Campos

Ainda não deu... e coloquei um dado errado na tabela anterior.

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 :)
Responder

Gostei + 0

10/09/2010

Wilson Junior

Teste assim:
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.
Responder

Gostei + 0

10/09/2010

Wilson Junior

Teste assim:
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.
Responder

Gostei + 0

10/09/2010

Ludmila Campos

Agora sim...

Muito obrigada Wilson... vc salvou minha vida...rs...rs.rs

[]s,


Até ++
Responder

Gostei + 0

29/04/2013

José

Duvida inicial solucionada, estou marcando este tópico como concluído.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar