Select complicado. Três tabelas

Firebird

24/11/2005

No meu banco de dados tenho as seguintes tabelas.

Produto: Codigo, Nome, Grupo
Grupo de Produtos: Codigo, Nome
Itens do Pedido: Pedido, Produto, Qtde

Meus relacionamentos são Produto -> Grupo
e Itens Pedido -> Produto

Gostaria de fazer um select que me retorna-se a quantidade vendida
do grupo. Por exemplo

Grupo Qtde
Hidraulica 100
Alvenaria 120
Eletrica 0

Como posso fazer ?
Obrigado


Emarcolongo

Emarcolongo

Curtidas 1

Melhor post

Weber

Weber

24/11/2005

Select c.nome, Sum(a.Qtde) From ItemPedido a
Left Join Produto b on a.produto = b.codigo
Left Join Grupo c on b.grupo = c.codigo
Group by c.nome



GOSTEI 1

Mais Respostas

Emarcolongo

Emarcolongo

24/11/2005

weber, valeu pela dica mas não deu muito certo.
a quantidade retornada esta errada.

Grupo Qtde
Hidraulica 1

deveria ser:

Grupo Qtde
Hidraulica 120


GOSTEI 0
Bruno Belchior

Bruno Belchior

24/11/2005

tem certeza que sua conta está correta... ao meu ver a resposta do colega [b:b3e348e50d]weber[/b:b3e348e50d] funcionaria...


GOSTEI 0
Emarcolongo

Emarcolongo

24/11/2005

Testei e não funcionou como deveria.
Segue abaixo os dados

Tab.Produtos:
Cod..........Nome...........................Grupo......
1..............Prego...........................<null>.....
2..............Martelo.........................<null>.....
3..............Lixa.................................4.........
4..............Chave de Fenda...............2.........

Tab.Grupos:
Cod..........Nome......
1..............Hidraulica
2..............Eletrica
3..............Alvenaria
4..............Mecanica

Itens do Pedido:
Pedido..........Produto..........Qtde.........Total........
1..................1...................10.............100.........
1..................3...................20.............120.........
1..................4...................20.............150.........
2..................3...................100...........600.........
2..................4...................20.............150.........
3..................2...................25.............120.........

O resultado deveria ser:
Cod..........Nome...........Qtde...........
1..............Hidraulica......<null>
2..............Eletrica..........40.....
3..............Alvenaria.......<null>
4..............Mecanica.......120....


Os produtos que não tem grupos informados aparecerão nulos
Com este resultado pretendo criar graficos.

Obrigado.


GOSTEI 0
Afarias

Afarias

24/11/2005

select g.cod, g.nome, sum(i.qtde) from grupos g
left join produtos p on (p.grupo=g.cod)
left join itens i on (i.produto=p.cod)
group by g.cod, g.nome;


T+


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/11/2005

select
  g.codigo, g.nome, sum(i.qtde)
from
  itenspedido i
left join
  produto p on (p.codigo = i.produto)
left join
  grupo g on (g.codigo = p.grupo)
group by
  g.codigo, g.nome


inverti a tabela grupo com a tabela itenspedido porque da forma exemplificada pelo nosso colega [b:a2a00a78c5]afarias[/b:a2a00a78c5] serão trazidos na instrução todos os grupos, independente de algum dos seus produtos terem sido vendidos - obviamente esses virão com qtde 0 (zero).
da forma que eu estou mostrando serão trazidos apenas os grupos cujos produtos sofreram alguma venda.

use o que lhe for mais conveniente.


GOSTEI 0
Emarcolongo

Emarcolongo

24/11/2005

Obrigado a todos, funcionou perfeitamente.

Agora mais uma duvida, se não for pedir demais, como posso fazer para selecionar somente um periodo das vendas ? Este data esta no cadastro de pedido que esta relacionado ao de itens.

Obrigado, mais uma vez.


GOSTEI 1
Emerson Nascimento

Emerson Nascimento

24/11/2005

assim:
select g.cod, g.nome, sum(i.qtde)
from grupos g 
left join produtos p on (p.grupo=g.cod) 
left join itens i on (i.produto=p.cod) 
inner join pedidos ped on (ped.numpedido = i.numpedido)
where ped.data between "datainicial" and "datafinal"
group by g.cod, g.nome


ou assim:
select 
  g.codigo, g.nome, sum(i.qtde) 
from 
  itenspedido i 
inner join
  pedidos ped on (ped.numpedido = i.numpedido)
left join 
  produto p on (p.codigo = i.produto) 
left join 
  grupo g on (g.codigo = p.grupo) 
where
  ped.data between "datainicial" and "datafinal"
group by 
  g.codigo, g.nome



GOSTEI 0
Emarcolongo

Emarcolongo

24/11/2005

Emerson, obrigado pela dica.

No caso do sql que vc enviou, se não houve venda no intervalo ele não retorna nada, e eu gostaria que retornasse o nome do grupo com o campo qtde informado null. E no caso de existem vendas no periodo o sql retorna somente os grupos que tiveram venda.
Fica claro ?

Obrigado.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/11/2005

tente assim:
select 
  g.cod, g.nome,
  (select
     sum(coalesce(i.qtde,0))
   from
     itenspedido i
   inner join
     pedidos ped on (ped.numpedido = i.numpedido
         and ped.data between "datainicial" and "datafinal")
   left join
     produtos p on (p.codigo = i.produto)
   where
     p.grupo = g.cod)
from
  grupos g



GOSTEI 0
POSTAR