Junção de Várias Tabelas
Olá Pessoal!
Tenho um problema em um "select" no firebird que não consigo resolver de jeito nenhum.
Para melhor entendimento, vou criar um exemplo parecido:
Tenho 4 tabelas:
1) CODIGO - IDCODIGO, DESCRICAO;
2) ITEMPROGRAMADO - IDITEMPROGRAMADO, IDCODIGO, QTDE;
3) ITEMPRODUZIDO - IDITEMPRODUZIDO, IDCODIGO, QTDE;
4) ITEMENVIADO - IDITEMENVIADO, IDCODIGO, QTE;
Eu preciso realizar um select onde a resposta seja:
CODIGO | PROGRAMADO | PRODUZIDO | ENVIADO
Eu usei o seguinte código:
SELECT c.CODIGO,
CASE
WHEN avg(IPG.quantidade) IS NULL THEN 0
ELSE avg(IPG.quantidade)
END AS PROGRAMADO,
CASE
WHEN sum(Ie.quantidade) IS NOT NULL THEN sum(Ie.quantidade)
ELSE 0
END AS ENVIADO,
CASE
WHEN SUM(IPR.quantidade) IS NOT NULL THEN SUM(IPR.quantidade)
ELSE 0
END AS PRODUZIDO
FROM codigo C
full join itemprogramado IPG on IPG.idcodigo = C.idcodigo
full join itemenviado Ie on Ie.idcodigo = C.idcodigo
full join itemproduzido IPR on IPR.idcodigo = IH.idcodigo
group by c.codigo
Contudo, o somatório dos valores dos ítem produzidos está dando um valor absurdo! As demais colunas estão corretas. Alguém tem alguma idéia de como fazer isso?
Grato,
Tenho um problema em um "select" no firebird que não consigo resolver de jeito nenhum.
Para melhor entendimento, vou criar um exemplo parecido:
Tenho 4 tabelas:
1) CODIGO - IDCODIGO, DESCRICAO;
2) ITEMPROGRAMADO - IDITEMPROGRAMADO, IDCODIGO, QTDE;
3) ITEMPRODUZIDO - IDITEMPRODUZIDO, IDCODIGO, QTDE;
4) ITEMENVIADO - IDITEMENVIADO, IDCODIGO, QTE;
Eu preciso realizar um select onde a resposta seja:
CODIGO | PROGRAMADO | PRODUZIDO | ENVIADO
Eu usei o seguinte código:
SELECT c.CODIGO,
CASE
WHEN avg(IPG.quantidade) IS NULL THEN 0
ELSE avg(IPG.quantidade)
END AS PROGRAMADO,
CASE
WHEN sum(Ie.quantidade) IS NOT NULL THEN sum(Ie.quantidade)
ELSE 0
END AS ENVIADO,
CASE
WHEN SUM(IPR.quantidade) IS NOT NULL THEN SUM(IPR.quantidade)
ELSE 0
END AS PRODUZIDO
FROM codigo C
full join itemprogramado IPG on IPG.idcodigo = C.idcodigo
full join itemenviado Ie on Ie.idcodigo = C.idcodigo
full join itemproduzido IPR on IPR.idcodigo = IH.idcodigo
group by c.codigo
Contudo, o somatório dos valores dos ítem produzidos está dando um valor absurdo! As demais colunas estão corretas. Alguém tem alguma idéia de como fazer isso?
Grato,
Rafael Ribeiro
Curtidas 0
Respostas
Eliézio Mesquita
14/05/2010
Bom dia,
Caro Rafael, eu vejo campos que você deseja retornar
CODIGO | PROGRAMADO | PRODUZIDO | ENVIADO, este campos existem na sua tabela, porque no exemplo que você colocou eles não aparecem.
Precisamos saber os campos para poder montar a cosulta.
Eliézio Mesquita
Caro Rafael, eu vejo campos que você deseja retornar
CODIGO | PROGRAMADO | PRODUZIDO | ENVIADO, este campos existem na sua tabela, porque no exemplo que você colocou eles não aparecem.
Precisamos saber os campos para poder montar a cosulta.
Eliézio Mesquita
GOSTEI 0
Emerson Nascimento
14/05/2010
creio que dê pra resolver com sub-selects:
select
c.CODIGO,
(select coalesce(sum(IPG.quantidade),0)
from itemprogramado IPG on IPG.idcodigo = C.idcodigo) PROGRAMADO,
(select coalesce(sum(IE.quantidade),0)
from itemenviado IE on IE.idcodigo = C.idcodigo) ENVIADO,
(select coalesce(sum(IPR.quantidade),0)
from itemproduzido IPR on IPR.idcodigo = C.idcodigo) PRODUZIDO
FROM
codigo C
select
c.CODIGO,
(select coalesce(sum(IPG.quantidade),0)
from itemprogramado IPG on IPG.idcodigo = C.idcodigo) PROGRAMADO,
(select coalesce(sum(IE.quantidade),0)
from itemenviado IE on IE.idcodigo = C.idcodigo) ENVIADO,
(select coalesce(sum(IPR.quantidade),0)
from itemproduzido IPR on IPR.idcodigo = C.idcodigo) PRODUZIDO
FROM
codigo C
GOSTEI 0
Rafael Ribeiro
14/05/2010
Emerson, valeu!
Com sub-selects resolveu sim!
Grato,
Com sub-selects resolveu sim!
Grato,
GOSTEI 0