none
Duvidas no retorno da consulta RRS feed

  • Pergunta

  • Boa tarde amigos, bom vou tentar explicar o problema, mas se surgir alguma duvida, é só avisar!

    o que acontece é o seguinte: estou montando uma consulta e nem é tão complicada assim nao, mas o resultado que ela retorna realmente me surpreendeu, pois nada explica esse resultado obtido.

    bom, eu preciso realizar uma consulta que vai me retornar a principio 3 valores do banco, em duas tabelas diferentes, vai retornar o numero do serviço, a qntd de horas estimadas para esse serviço e as qntd de horas que foram consumidas desse serviço, funciona mais ou menos assim:

    a minha empresa "XPTO". tem um contrato com a empresa "CONSTRUTUDO", nesse contrato eu tenho serviços, que podem ser vários, neste caso vamos dizer que a construtudo vai realizar 10 serviços, cada serviço tem um numero que é sua chave-primária, tem a qntd de horas estimadas para que ele seja concluido, exemplo: para o serviço 3 foram estimadas 100 horas pra ser concluido, e dentro desse serviço, podem ser realizadas várias etapas, por um unico funcionario, exemplo: o funcionario Joao Pedrosa, que está alocado neste contrato, vai trabalhar no serviço 3, em diferentes etapas, tais como: 10 horas na fundação da obra, mais 10 horas virando cimento, mais 10 horas levantando parede, mais 5 horas virando lage, mais 4 horas no acabamento, entao no mesmo serviço ele realizou 5 trabalhos e cadastrou essas horas separadas na tabela horas. o que preciso é, qnd realizada a consulta no banco, trazer desta maneira o resultado:

    1ªColuna Numero Serviço - 2ª Coluna Horas Estimadas - 3ª Coluna Horas consumidas

    3  100 39

    mas o que está acontecendo é o seguinte:

    1ªColuna Numero Serviço - 2ª Coluna Horas Estimadas - 3ª Coluna Horas consumidas

    3                                                   500                                         39

    ou seja, ele está pegando as horas estimadas e somando a cada vez que a hora trabalhada é cadastrada, ele cadastrou 5 etapas diferentes, ele somou a hora estimada 5 vezes.

    segue o comando SQL e o resultado do banco:

    select o.numero 'OE', sum(poe.horas) 'Total horas estimadas', SUM(h.htrab) 'Horas Consumidas' from oes o left join perfis_oes poe on (poe.contrato = o.contrato AND poe.oe = o.numero) LEFT JOIN horas h ON (h.contrato = o.contrato AND h.oe = o.numero) group by o.numero

    1ªColuna Numero Serviço - 2ª Coluna Horas Estimadas - 3ª Coluna Horas consumidas

    1 288   NULL
    2 40 NULL
    3 69120   128
    4 4320   NULL
    5 480 NULL
    6 900 NULL
    7 152 NULL
    8 120 NULL
    9 168 NULL
    10 112  NULL

    bom, o que aconteceu aki foi o seguinte, na tabela horas, o funcionario cadastrou 8 horas de trabalho em 16 serviços diferentes, e a 'OE' 3 tem 4320 'Total horas estimadas', o total de horas consumidas veio certo do banco, que são 128, mas ao inves de manter as 4320 horas estimadas ele somou 16 vezes o valor estimado, pra cada registro de hora trabalhada, ele somou dinovo a hora estimada!

    alguem sabe me dizer o que está errado no meu comando SQL, ou o que posso fazer para solucionar este problema!!

    Desde já agradeço a atenção

    quinta-feira, 9 de fevereiro de 2012 16:46

Todas as Respostas

  • Marcos,

    O valor das horas estimadas é somado porque você o está somando na query. 

    Você deve soma as horas trabalhadas e agrupar por número de serviço e horas estimadas.

    Tente isso:

    select 
    	o.numero 'OE', poe.horas 'Total horas estimadas', 
    	SUM(h.htrab) 'Horas Consumidas' 
    from 
    	oes o 
    	left join perfis_oes poe on (poe.contrato = o.contrato AND poe.oe = o.numero) 
    	LEFT JOIN horas h ON (h.contrato = o.contrato AND h.oe = o.numero) 
    group by o.numero, poe.horas

    Abraço,


    Carlos Eduardo Ferreira

    quinta-feira, 9 de fevereiro de 2012 16:58
  • é quease isso carlos eduardo, o que acontece é o seguinte, no retorno do resultado:

    1 80 NULL
    1 208 NULL
    2 1 NULL
    2 3 NULL
    2 4 NULL
    2 10 NULL
    3 4320 128
    4 4320 NULL
    5 480 NULL
    6 900 NULL
    7 152 NULL
    8 120 NULL
    9 168 NULL
    10 112 NULL
    11 288 NULL
    12 240 NULL
    13 1160 NULL
    14 1416 NULL
    15 1816 NULL
    16 1496 NULL
    17 1984 NULL
    18 2312 NULL
    19 128 NULL
    20 1624 NULL
    21 1996 NULL
    22 216 NULL
    22 2520 NULL

    repare que as oes estão separadas com o mesmo numero, e eu preciso disponibilizalas juntas, tipo, se for oe 1, como no caso aqui, com 80 horas e depois com 208, eu preciso que retorne 288, e nao as duas separadas, mas já melhorou o resultado... alguma outra ideia!

    quinta-feira, 9 de fevereiro de 2012 17:04
  • é quease isso carlos eduardo, o que acontece é o seguinte, no retorno do resultado:

    1 80 NULL
    1 208 NULL
    2 1 NULL
    2 3 NULL
    2 4 NULL
    2 10 NULL
    3 4320 128
    4 4320 NULL
    5 480 NULL
    6 900 NULL
    7 152 NULL
    8 120 NULL
    9 168 NULL
    10 112 NULL
    11 288 NULL
    12 240 NULL
    13 1160 NULL
    14 1416 NULL
    15 1816 NULL
    16 1496 NULL
    17 1984 NULL
    18 2312 NULL
    19 128 NULL
    20 1624 NULL
    21 1996 NULL
    22 216 NULL
    22 2520 NULL

    repare que as oes estão separadas com o mesmo numero, e eu preciso disponibilizalas juntas, tipo, se for oe 1, como no caso aqui, com 80 horas e depois com 208, eu preciso que retorne 288, e nao as duas separadas, mas já melhorou o resultado... alguma outra ideia!

    Isso acontece porque em algum momento as horas estimadas estao sendo cadastradas diferentes para o mesmo serviço. 

    ___________________________________________ Se o post ajudou marque como resposta ;)

    sexta-feira, 10 de fevereiro de 2012 15:45
  • Marcos,

    Você poderia postar a modelagem do banco dessas tabelas da query?


    Carlos Eduardo Ferreira

    sábado, 11 de fevereiro de 2012 16:37