Select complicado. Três tabelas
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
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
Curtidas 1
Melhor post
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
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
a quantidade retornada esta errada.
Grupo Qtde
Hidraulica 1
deveria ser:
Grupo Qtde
Hidraulica 120
GOSTEI 0
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
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.
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
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+
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
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
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.
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
24/11/2005
assim:
ou 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
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.
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
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