Select complicado. Três tabelas

24/11/2005

0

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

Responder

Post mais votado

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



Weber

Weber
Responder

Mais Posts

24/11/2005

Emarcolongo

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


Responder

24/11/2005

Bruno Belchior

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


Responder

24/11/2005

Emarcolongo

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.


Responder

24/11/2005

Afarias

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+


Responder

24/11/2005

Emerson Nascimento

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.


Responder

25/11/2005

Emarcolongo

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.


Responder

25/11/2005

Emerson Nascimento

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



Responder

25/11/2005

Emarcolongo

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.


Responder

25/11/2005

Emerson Nascimento

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



Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar