Давно было интересно реализовать на SQL разбиение множества товаров на группы ABC.
Создадим таблицу для примера.
CREATE TABLE test.abc_data ( product_name text, sum_sale numeric(14,2) ); insert into test.abc_data values (1, 15429930), (2, 13497652), (3, 12796790), (4, 12209909), (5, 12209909), (6, 11529588), (7, 10942376), (8, 7166437), (9, 2730968);
ABC - скрипт на PostgreSQL через оконные функции.
select t.product_name,
t.persent,
t.sum_prod/t.sum_sale as present_prod,
t.ranks,
case
when t.sum_prod/t.sum_sale < 0.8 then 'A'
when t.sum_prod/t.sum_sale between 0.8 and 0.95 then 'B'
else 'C'
end as product_type
from
(
SELECT product_name,
sum_sale/sum(sum_sale) over() as persent,
sum(sum_sale) over(order by sum_sale DESC, product_name) as sum_prod,
rank() over(order by sum_sale DESC, product_name) as ranks,
sum(sum_sale) over() as sum_sale
FROM test.abc_data
) as t
Объясним работу SQL скрипта:
Результат работы скрипта.
Ссылки на материалы: