Select complicado. Três tabelas
24/11/2005
0
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
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
Mais Posts
24/11/2005
Emarcolongo
a quantidade retornada esta errada.
Grupo Qtde
Hidraulica 1
deveria ser:
Grupo Qtde
Hidraulica 120
24/11/2005
Bruno Belchior
24/11/2005
Emarcolongo
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.
24/11/2005
Afarias
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+
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.
25/11/2005
Emarcolongo
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.
25/11/2005
Emerson Nascimento
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
25/11/2005
Emarcolongo
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.
25/11/2005
Emerson Nascimento
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
Clique aqui para fazer login e interagir na Comunidade :)