Página 1 de 1

query mysql para curva ABC

Enviado: 06 Jul 2022 11:03
por alexlucc
Bom dia amigos,

Estou desenvolvendo uma query para relatório da curva abc dos produtos. Estou enfrentenado dificuldade para fazer o acumulado dos percentuais para depois a aplicar a classificação "A", "B" ou "C". Se algum tiver alguma idéia fico grato.

Código: Selecionar todos

SET @totger = (SELECT SUM(CAST(subtot AS DECIMAL(15,3))) FROM itemvendas) ;
SELECT 
    d1.codbar,
    d1.valor_item,
    d1.prod,
    @totger as total_geral,
   (CAST(d1.valor_item AS DECIMAL(15,3)) / @totger) * 100 perc 

FROM (

SELECT 
     d.codbar,
     d.valor_item,
     d.prod,
     @totger as total_geral,
 (CAST(d.valor_item AS DECIMAL(15,3)) / @totger) * 100 perc
 
FROM ( 	
SELECT
    ni.codbar,
    SUM(ni.subtot) AS valor_item, pro.nomcom AS prod
FROM itemvendas ni
INNER JOIN produtos pro ON pro.codbar = ni.codbar
	
GROUP BY ni.codbar
ORDER BY 2 DESC ) d ) d1

query mysql para curva ABC

Enviado: 07 Jul 2022 15:02
por JoséQuintas
Esse confunde, ainda mais que curva ABC não tem um modo padrão de ser calculado.

query mysql para curva ABC

Enviado: 07 Jul 2022 19:10
por alxsts
Olá!
JoséQuintas escreveu:Esse confunde, ainda mais que curva ABC não tem um modo padrão de ser calculado.
Sem conhecer as tabelas, fica mais difícil ainda... e sem conhecer como quer calcular a curva, mais difícil ainda...

Veja este artigo: Como fazer curva ABC? Veja o passo a passo e aplique em seu negócio

Use a tag [ code ] para postar código fonte. Veja aqui como utilizar.

query mysql para curva ABC

Enviado: 08 Jul 2022 11:12
por Fernando queiroz

query mysql para curva ABC

Enviado: 10 Jul 2022 18:55
por Fernando queiroz
Solucao para o caso, agora é somente adaptação para o seu caso

Código: Selecionar todos

SET @PER_ACUMULADO := 0 ;
SET @SOMA_1 := 0 ;
SET @SOMA_2 := 0 ;
SET @SOMA_3 := 0 ;

SELECT 
pedidositens.PRODUTOS_ID, 
pedidositens.DESPRO, 
pedidositens.TIPUNI, 
SUM(pedidositens.VLRTOT) AS VALORTOTAL,
ROUND(SUM(pedidositens.VLRTOT) / (SELECT 
SUM(pedidositens.VLRTOT) 
FROM pedidositens
JOIN pedidos ON pedidositens.PEDIDOS_ID = pedidos.PEDIDOS_Id 
WHERE pedidos.DATVEN BETWEEN '2021-07-11' AND '2022-07-11' AND pedidos.ST = '0' AND pedidos.TIPO_OPERACAO != 85 AND pedidos.TIPO_OPERACAO != 90 AND pedidos.TIPO_OPERACAO != 91) * 100, 2) AS PATICIPACAO,
(SELECT @PER_ACUMULADO := @PER_ACUMULADO + 
(ROUND(SUM(pedidositens.VLRTOT) / (SELECT 
SUM(pedidositens.VLRTOT) 
FROM pedidositens
JOIN pedidos ON pedidositens.PEDIDOS_ID = pedidos.PEDIDOS_Id 
WHERE pedidos.DATVEN BETWEEN '2021-07-11' AND '2022-07-11' AND pedidos.ST = '0' AND pedidos.TIPO_OPERACAO != 85 AND pedidos.TIPO_OPERACAO != 90 AND pedidos.TIPO_OPERACAO != 91) * 100, 2) ) ) AS ACUMULADO,
CASE
	WHEN (SELECT @SOMA_1 := @SOMA_1 + 
		  	(ROUND(SUM(pedidositens.VLRTOT) / (SELECT 
			SUM(pedidositens.VLRTOT) 
			FROM pedidositens
			JOIN pedidos ON pedidositens.PEDIDOS_ID = pedidos.PEDIDOS_Id 
			WHERE pedidos.DATVEN BETWEEN '2021-07-11' AND '2022-07-11' AND pedidos.ST = '0' AND pedidos.TIPO_OPERACAO != 85 AND pedidos.TIPO_OPERACAO != 90 AND pedidos.TIPO_OPERACAO != 91) * 100, 2) ) )  > 50.00 THEN "C"
	WHEN (SELECT @SOMA_2 := @SOMA_2 + 
		  	(ROUND(SUM(pedidositens.VLRTOT) / (SELECT 
			SUM(pedidositens.VLRTOT) 
			FROM pedidositens
			JOIN pedidos ON pedidositens.PEDIDOS_ID = pedidos.PEDIDOS_Id 
			WHERE pedidos.DATVEN BETWEEN '2021-07-11' AND '2022-07-11' AND pedidos.ST = '0' AND pedidos.TIPO_OPERACAO != 85 AND pedidos.TIPO_OPERACAO != 90 AND pedidos.TIPO_OPERACAO != 91) * 100, 2) ) )  > 30.00 THEN "B"
	WHEN (SELECT @SOMA_3 := @SOMA_3 + 
		  	(ROUND(SUM(pedidositens.VLRTOT) / (SELECT 
			SUM(pedidositens.VLRTOT) 
			FROM pedidositens
			JOIN pedidos ON pedidositens.PEDIDOS_ID = pedidos.PEDIDOS_Id 
			WHERE pedidos.DATVEN BETWEEN '2021-07-11' AND '2022-07-11' AND pedidos.ST = '0' AND pedidos.TIPO_OPERACAO != 85 AND pedidos.TIPO_OPERACAO != 90 AND pedidos.TIPO_OPERACAO != 91) * 100, 2) ) )  < 31.00 THEN "A"
END AS CLASSIFICACAO

FROM pedidositens 
JOIN pedidos ON pedidositens.PEDIDOS_ID = pedidos.PEDIDOS_Id 
WHERE pedidos.DATVEN BETWEEN '2021-07-11' AND '2022-07-11' AND pedidos.ST = '0' AND pedidos.TIPO_OPERACAO != 85 AND pedidos.TIPO_OPERACAO != 90 AND pedidos.TIPO_OPERACAO != 91
GROUP BY pedidositens.PRODUTOS_ID 
ORDER BY VALORTOTAL DESC

query mysql para curva ABC

Enviado: 10 Jul 2022 18:57
por Fernando queiroz
curva abc.jpg

query mysql para curva ABC

Enviado: 11 Jul 2022 08:26
por Fernando queiroz
Dei uma otimizada na query

Código: Selecionar todos

SET @TOT_VENDAS = (SELECT SUM(pedidositens.VLRTOT) 
                  FROM pedidositens 
						JOIN pedidos ON pedidositens.PEDIDOS_ID = pedidos.PEDIDOS_Id 
						WHERE pedidos.DATVEN BETWEEN '2021-07-11' AND '2022-07-11' 
						AND pedidos.ST = '0' 
						AND pedidos.TIPO_OPERACAO != 85 
						AND pedidos.TIPO_OPERACAO != 90 
						AND pedidos.TIPO_OPERACAO != 91);
SET @PER_ACUMULADO := 0 ;
SET @SOMA_1 := 0 ;
SET @SOMA_2 := 0 ;
SET @SOMA_3 := 0 ;
SELECT 
pedidositens.PRODUTOS_ID, 
pedidositens.DESPRO, 
pedidositens.TIPUNI, 
SUM(pedidositens.VLRTOT) AS VALORTOTAL,
ROUND(SUM(pedidositens.VLRTOT) / @TOT_VENDAS  * 100, 2) AS PARTICIPACAO,
(SELECT @PER_ACUMULADO := @PER_ACUMULADO + ROUND(SUM(pedidositens.VLRTOT) / @TOT_VENDAS  * 100, 2) ) AS ACUMULADO,
CASE
	WHEN (SELECT @SOMA_1 := @SOMA_1 + (ROUND(SUM(pedidositens.VLRTOT) / @TOT_VENDAS * 100, 2) ) )  > 50.00 THEN "C"
	WHEN (SELECT @SOMA_2 := @SOMA_2 + (ROUND(SUM(pedidositens.VLRTOT) / @TOT_VENDAS * 100, 2) ) )  > 30.00 THEN "B"
	WHEN (SELECT @SOMA_3 := @SOMA_3 + (ROUND(SUM(pedidositens.VLRTOT) / @TOT_VENDAS * 100, 2) ) )  < 31.00 THEN "A"
END AS CLASSIFICACAO
FROM pedidositens 
JOIN pedidos ON pedidositens.PEDIDOS_ID = pedidos.PEDIDOS_Id 
WHERE pedidos.DATVEN BETWEEN '2021-07-11' AND '2022-07-11' AND pedidos.ST = '0' AND pedidos.TIPO_OPERACAO != 85 AND pedidos.TIPO_OPERACAO != 90 AND pedidos.TIPO_OPERACAO != 91
GROUP BY pedidositens.PRODUTOS_ID 
ORDER BY VALORTOTAL DESC

query mysql para curva ABC

Enviado: 11 Jul 2022 13:24
por Fernando queiroz
TELA1.jpg

query mysql para curva ABC

Enviado: 17 Jul 2022 09:36
por alexlucc
Bom dia Fernando, Quintas.

Obrigado pela ajuda amigos, consegui implementar ficou assim:



SELECT
d2.codbar,
d2.nomcom,
d2.nomcat,
d2.nomgru,
d2.nomlab,
d2.valor,
d2.vendidos,
d2.Faturamento,
d2.perc,
d2.Perc_Acumulado,
case when d2.Perc_Acumulado <= 80 then 'A'
when d2.Perc_Acumulado <= 95 then 'B'
ELSE 'C' END CLASSE

FROM (

SELECT
d1.codbar,
d1.nomcom,
d1.nomcat,
d1.nomgru,
d1.nomlab,
d1.valor,
d1.vendidos,
d1.Faturamento,
d1.perc,
SUM(d1.perc) OVER(order by d1.perc DESC) Perc_Acumulado
from(

SELECT
d.codbar,
d.nomcom,
d.nomcat,
d.nomgru,
d.nomlab,
d.valor,
d.vendidos,
sum(d.valor) over() as Faturamento,
cast(d.valor as decimal(15,2)) / cast(sum(d.valor) over() as decimal(15,3)) *100 perc

FROM (

SELECT i.codbar,p.nomcom,p.nomcat,p.nomgru,p.nomlab,SUM(i.subtot) as valor,SUM(i.qtde) as vendidos from itemvendas AS I
INNER JOIN PRODUTOS AS P ON ( P.codbar = I.codbar)
inner join vendas AS v ON (v.venda = i.venda)
WHERE v.dtemi BETWEEN '2022-01-01' AND '2022-06-30' AND v.cancelado = 0 AND v.tipoimpor <> 04
group BY i.codbar order BY valor desc) d)d1)d2


* A finalidade dessa é em relação a Venda, agora vou fazer uma com a finalidade de rotatividade do Estoque.