Ir para conteúdo
Fórum Script Brasil
  • 0

SELECT DISTINCT com SUM em duplicidade


Fcesar

Pergunta

Estou utilizando uma consulta e nela desejo trazer a soma de um campo TIME, onde há relacionamento entre as tabelas.

Porém o somatório do tempo é trazido em duplicidade mas o restante está correto, como se eu não estivesse utilizando o DISTINCT.. Fiz um teste e quando retiro o somatório do tempo (TEMPO_TOTAL) e coloco apenas para mostrar o campo TEMPO e também tiro o GROUP BY no final, então os registros são trazidos corretamente e a soma dos tempos de cada registro daria o valor que desejo. Alguém pode me dizer por que o SUM com o group by não retorna o somatório correto?

Obrigado

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'Fcesar' !

Informe o select que você está usando, uma pequena massa de dados de cada tabela (pode ser fictício) e a parte da estrutura de cada tabela (os nomes dos campos podem ser ficticios), para que possamos testar e achar uma solução.

Link para o comentário
Compartilhar em outros sites

  • 0
Oi, 'Fcesar' !

Informe o select que você está usando, uma pequena massa de dados de cada tabela (pode ser fictício) e a parte da estrutura de cada tabela (os nomes dos campos podem ser ficticios), para que possamos testar e achar uma solução.

Denis,

Seria essa a consulta:

SELECT distinct tbl_cliente.NOME,
LOGIN,
( SUM( TIME_TO_SEC( TEMPO_EXECUCAO ) ) / 3600 ) as TEMPOTOTAL,
Group_Concat(Distinct tbl_rt_cliente.RT Order By tbl_rt_cliente.RT Desc Separator ' / ') as RT,
tbl_projeto.NUMERO_PROJETO,
tbl_projeto.IDENTIFICADOR,
FROM tbl_projeto_func
LEFT JOIN tbl_projeto On tbl_projeto_func.PROJETO = tbl_projeto.IDENTIFICADOR
LEFT JOIN tbl_projeto_atividade On tbl_projeto_atividade.Projeto = tbl_projeto.IDENTIFICADOR
LEFT JOIN tbl_cliente On tbl_projeto.cliente = tbl_cliente.Identificador
LEFT JOIN tbl_projeto_rt_cliente On tbl_projeto_rt_cliente.Projeto = tbl_projeto.IDENTIFICADOR
LEFT JOIN tbl_rt_cliente On tbl_projeto_rt_cliente.RT = tbl_rt_cliente.IDENTIFICADOR
LEFT JOIN tbl_departamento_cliente On tbl_rt_cliente.DEPARTAMENTO = tbl_departamento_cliente.IDENTIFICADOR
INNER JOIN tbl_funcionario On tbl_projeto_func.FUNCIONARIO = tbl_funcionario.IDENTIFICADOR  AND tbl_funcionario.DESATIVADO = -1
WHERE ENCERRADO <> 3  AND tbl_projeto_func.FUNCIONARIO = 15
GROUP BY tbl_projeto.IDENTIFICADOR ORDER BY NUMERO_PROJETO

Existe uma tabela de projetos e para cada projeto podem haver vários funcionários (tbl_projeto_func) e ainda podem conter várias atividades (tbl_projeto_atividade) que também contém o campo FUNCIONARIO. Quero listar todos os projetos que contenham os funcionários na tabela tbl_projeto_func e que some o total de horas de atividades do projeto na tabela projeto_atividade.

Editado por Denis Courcy
Melhoria do entendimento do código
Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'Fcesar',

Não use

INNER JOIN tbl_funcionario On tbl_projeto_func.FUNCIONARIO = tbl_funcionario.IDENTIFICADOR AND tbl_funcionario.DESATIVADO = -1

assim. tbl_funcionario.DESATIVADO = -1 Não faz parte da chave de referência, pelo que estou entendendo. Coloque esta informação na cláusula WHERE.

Quem é TEMPO_EXECUCAO? De que tabela vem? Estou tentando estabelecer a necessidade de tantas tabelas neste join.

Link para o comentário
Compartilhar em outros sites

  • 0
Oi, 'Fcesar',

Não use

INNER JOIN tbl_funcionario On tbl_projeto_func.FUNCIONARIO = tbl_funcionario.IDENTIFICADOR AND tbl_funcionario.DESATIVADO = -1

assim. tbl_funcionario.DESATIVADO = -1 Não faz parte da chave de referência, pelo que estou entendendo. Coloque esta informação na cláusula WHERE.

Quem é TEMPO_EXECUCAO? De que tabela vem? Estou tentando estabelecer a necessidade de tantas tabelas neste join.

Denis,

Para esse caso é necessário passar o funcionário como parâmetro, eu consegui fazer deu certo. Inclui a cláusula tbl_projeto_atividade.FUNCIONARIO = tbl_projeto_func.FUNCIONARIO, ou seja, irá trazer o somatório somente das atividades de um determinado funcionário no projeto em que ele estiver cadastrado.

A necessidade das tabelas é por essa razão, em um projeto podem existir mais de um funcionário e para cada funcionário diversas atividades e diferentes responsáveis, tem mais informações que são listadas, só coloquei as essenciais ai.

Porém para a consulta geral (sem passar o funcionário) não está dando certo, existem para um certo projeto 2 registros na tabela tbl_projeto_rt_cliente e quando somo o tempo as atividades (TEMPO_EXECUCAO da tabela tbl_projeto_atividade), o total está vindo em dobro, um para cada registro, que mesmo com distinct soma dobrado. Eu uso um concat para trazer os nomes dos dois RTs que são os esses dois registros mas o total vem errado.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...