Ir para conteúdo
Fórum Script Brasil
  • 0

Consulta para curva ABC


fiito_pvai

Pergunta

Boa tarde a todos. Não tenho muita experiencia com mysql e estou tentando criar uma consulta para um relatório de curva ABC de produtos.

Esse é o select que tenho no momento:

"select
   produto.id,
   produto.descricao,
   sum(venda_item.quantidade) as qtde_venda,
   round(sum(venda_item.vl_unitario_liquido)/sum(venda_item.quantidade),2) as vr_unitario,
   round(sum(venda_item.vl_liquido),2) as vl_total_venda,
   round((sum(venda_item.vl_liquido)/(select sum(vl_liquido)from venda_item,venda where venda.id = venda_item.id_venda and venda.status = "FECHADO")),4)*100 as participacao,
 from
   produto
inner join venda_item on produto.id = venda_item.id_produto
inner join venda on venda_item.id_venda = venda.id
where venda.status = 'FECHADO'
group by id_produto
order by vl_total_venda desc"

 

O qual me retornar o seguinte resultado:

id descricao qtde_venda vr_unitario vl_total_venda participacao
1 PRODUTO TESTE 19 100 1900 62,71
4 PRODUTO TESTE 4 3 66,67 600 19,8
2 PRODUTO TESTE 2 6 6,67 240 7,92
3 PRODUTO TESTE 3 5 6 150 4,95
5 PRODUTO TESTE 5 1 140 140 4,62

 

O que preciso agora é calcular a participação acumulada, onde consiste em somar a participação de um item com a participação do item anterior até chegar ao valor de 100%, onde o resultador seria:
 

id descricao qtde_venda vr_unitario vl_total_venda participacao % Acumulado
1 PRODUTO TESTE 19 100 1900 62,71 62,71
4 PRODUTO TESTE 4 3 66,67 600 19,8 82,51
2 PRODUTO TESTE 2 6 6,67 240 7,92 90,43
3 PRODUTO TESTE 3 5 6 150 4,95 95,38
5 PRODUTO TESTE 5 1 140 140 4,62 100

 

E por fim, informar se o produto faz parte da curva A, B ou C, tendo a referência 70/20/10. Até 70% dos custos do Total Acumulado serão da Classe A; de 70% até 90% serão da Classe B e acima de 90% serão da Classe C, obtendo esse resultado:
 

id descricao qtde_venda vr_unitario vl_total_venda participacao % Acumulado ABC
1 PRODUTO TESTE 19 100 1900 62,71 62,71    A
4 PRODUTO TESTE 4 3 66,67 600 19,8 82,5    B
2 PRODUTO TESTE 2 6 6,67 240 7,92 90,43    C
3 PRODUTO TESTE 3 5 6 150 4,95 95,38    C
5 PRODUTO TESTE 5 1 140 140 4,62 100    C

 

Desde já agradeço a qualquer ajuda!! Abraço a todos.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

 

Esta aqui foi uma sollução que deu certo pra mim. no caso é só subustituir
eu estava com o mesmo problema rsrs
espero ter ajudado
set @soma = 0;
set @soma1 = 0;
set @soma2 = 0;
set @soma3 = 0;
set @soma4 = 0;
select p.id_produto, p.descricao, p.preco_venda, sum(iv.qtd) as qtd_vendida, 
round((sum(iv.qtd) * p.preco_venda), 2) as valor_total, 
round((select SUM(qtd * preco_venda) from produto, itens_venda where produto_id = id_produto), 2) as total,
round(((sum(iv.qtd) * p.preco_venda)/(select SUM(qtd * preco_venda) from produto, itens_venda where produto_id = id_produto) * 100), 2) as percentual,
(select @soma := @soma + round(((sum(iv.qtd) * p.preco_venda)/(select SUM(qtd * preco_venda) from produto, itens_venda where produto_id = id_produto) * 100), 2)) as acumulado,
CASE
when (select @soma3 := @soma3 + round(((sum(iv.qtd) * p.preco_venda)/(select SUM(qtd * preco_venda) from produto, itens_venda where produto_id = id_produto) * 100), 2)) > 90.00 then "C"
when (select @soma2 := @soma2 + round(((sum(iv.qtd) * p.preco_venda)/(select SUM(qtd * preco_venda) from produto, itens_venda where produto_id = id_produto) * 100), 2)) > 70.00 then "B" 
when (select @soma1 := @soma1 + round(((sum(iv.qtd) * p.preco_venda)/(select SUM(qtd * preco_venda) from produto, itens_venda where produto_id = id_produto) * 100), 2)) < 71.00 then "A"
when (select @soma4 := @soma4 + round(((sum(iv.qtd) * p.preco_venda)/(select SUM(qtd * preco_venda) from produto, itens_venda where produto_id = id_produto) * 100), 2)) is null then "D"
end
as classificacao,
v.data_venda
from produto p
left join itens_venda iv 
on iv.produto_id = p.id_produto 
left join venda v 
on iv.venda_id = v.id_venda 
group by p.id_produto
having cast(v.data_venda as DATE) between '2017-07-20' and '2017-08-09' or v.data_venda is null
order by valor_total DESC, p.id_produto ASC
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...