Procedure para organizar valores por ordem venda
Pessoal,
Talvez até já tenha discutido sobre esse assunto, mas não me dou muito bem na pesquisa desse fórum.
Bem, estou querendo fazer uma procedure que me devolvesse o seguinte, a venda dos vendedores por fornecedor com os 5 fornecedores mais vendidos e outra coluna informando o restante da venda dos outros fornecedores.
Dados do sistema
No meu resultado ficaria assim:
Não sei se fui claro.
Se precisar de mais detalhes e só postar quais detalhes precisa.
[b:7c18ec4614]ps. Coloquei 5 primeiros, mas na verdade preciso é dos 9 primeiros, sendo que atualmente a empresa conta com mais de 15 fornecedores [/b:7c18ec4614]
Talvez até já tenha discutido sobre esse assunto, mas não me dou muito bem na pesquisa desse fórum.
Bem, estou querendo fazer uma procedure que me devolvesse o seguinte, a venda dos vendedores por fornecedor com os 5 fornecedores mais vendidos e outra coluna informando o restante da venda dos outros fornecedores.
Dados do sistema
FORNECEDOR VALOR AAA R$ 200,00 BBB R$ 1250,00 CCC R$ 216,00 DDD R$ 5250,00 EEE R$ 2600,00 FFF R$ 6200,00 GGG R$ 150,00 HHH R$ 652,00
No meu resultado ficaria assim:
FORNECEDOR VALOR FFF R$ 6200,00 DDD R$ 5250,00 EEE R$ 2600,00 BBB R$ 1250,00 HHH R$ 652,00 OUTROS R$ 566,00
Não sei se fui claro.
Se precisar de mais detalhes e só postar quais detalhes precisa.
[b:7c18ec4614]ps. Coloquei 5 primeiros, mas na verdade preciso é dos 9 primeiros, sendo que atualmente a empresa conta com mais de 15 fornecedores [/b:7c18ec4614]
Digitom
Curtidas 0
Respostas
Diegotiemann
09/10/2008
Uma solução seria fazer uma consulta SQL do tipo:
Resolveria, é só adaptar pras suas tabelas mas vai ficar lento.
Select first 9 nome_forncedor valor_venda from ....order by valor_venda desc union select ´Outros´ , Sum(valor_venda) from ... where fornecedor not in (select first 9 fornecedor .......)
Resolveria, é só adaptar pras suas tabelas mas vai ficar lento.
GOSTEI 0
Digitom
09/10/2008
Blz, mas acho que não resolve o meu problema.
Veja só como é meu banco de dados:
TABELA (Campos)
FORNECEDOR (CODFOR - NOMEFOR)
PRODUTOS (CODPRO - NOMEPRODUTO - CODFOR)
NFSAIDA (NFNUMNOTA - NFVENDCOD - CODCLI - NFEMISSAO)
ITENSNOTAFISCAL (NUMNOTA - CODCLI - CODPRO - VALORVENDA - QUANTIDADE)
VENDEDORES (VENDCOD - VENDNOME)
Então pensei em fazer o seguinte:
Criar uma procedure para percorrer o cadastro de vendedor, e depois percorrer o cadastro de NFSAIDA juntamente com os ITENS para saber se existe venda do determinado fornecedor.
Veja só como é meu banco de dados:
TABELA (Campos)
FORNECEDOR (CODFOR - NOMEFOR)
PRODUTOS (CODPRO - NOMEPRODUTO - CODFOR)
NFSAIDA (NFNUMNOTA - NFVENDCOD - CODCLI - NFEMISSAO)
ITENSNOTAFISCAL (NUMNOTA - CODCLI - CODPRO - VALORVENDA - QUANTIDADE)
VENDEDORES (VENDCOD - VENDNOME)
Então pensei em fazer o seguinte:
Criar uma procedure para percorrer o cadastro de vendedor, e depois percorrer o cadastro de NFSAIDA juntamente com os ITENS para saber se existe venda do determinado fornecedor.
GOSTEI 0
Emerson Nascimento
09/10/2008
qual o banco de dados utilizado?
GOSTEI 0
Digitom
09/10/2008
Estou usando o FIREBIRD
GOSTEI 0
Emerson Nascimento
09/10/2008
creio que isso seja possível somente com stored procedure.
crie uma SP assim:
e execute um select como se fosse uma tabela normal:
select * from venda_por_fornecedor(5) -- lista os 5 maiores e consolida os demais
crie uma SP assim:
CREATE PROCEDURE VENDA_POR_FORNECEDOR ( listar integer) returns ( id_fornecedor integer, nomefornecedor varchar(60), valor float ) as declare variable isql varchar(255); -- instrução sql declare variable ifor varchar(255); -- lista de fornecedores begin listar = coalesce(listar, 0); if (listar < 0) then listar = 0; if (listar = 0) then begin select ´TODOS´, sum(it.valorvenda * it.quantidade) from itensnotafiscal into :nomefornecedor, :valor; id_fornecedor = -1; end else begin isql = ´select first ´ || cast(:listar as varchar(5)) || ´ f.codfor, f.nomefor,´ || ´ sum(it.valorvenda * it.quantidade)´ || ´from itensnotafiscal it´ || ´ inner join produtos p on (p.codpro = it.codpro)´ || ´ inner join fornecedor f on (f.codfor = p.codfor)´ || ´ group by f.codfor, f.nomefor´ || ´ order by 3 desc ´; ifor = ´´; for execute statement isql into :id_fornecedor, :nomefornecedor, :valor do begin if (ifor <> ´´) then ifor = ifor || ´,´; ifor = ifor || cast(:id_fornecedor as varchar(10)); suspend; end isql = ´select ´´OUTROS´´, sum(it.valorvenda * it.quantidade) ´ || ´from itensnotafiscal it ´ || ´inner join produtos p on (p.codpro = it.codpro) ´ || ´where not p.codfor in (´ || ifor || ´)´; execute statement isql into :nomefornecedor, :valor; id_fornecedor = -1; end suspend; end
e execute um select como se fosse uma tabela normal:
select * from venda_por_fornecedor(5) -- lista os 5 maiores e consolida os demais
GOSTEI 0