У меня есть набор данных о покупках с клиентом, продуктом и категорией.
customer product category sales_value
A aerosol air_care 10
B aerosol air_care 12
C aerosol air_care 7
A perfume air_care 8
A perfume air_care 2
D perfume air_care 11
C burger food 13
D fries food 6
C fries food 9
Я хочу для каждого продукта соотношение между стоимостью продаж, потраченной на этот продукт, и стоимостью продаж, потраченной на этот продукт.Категория продукта - по клиентам, которые купили продукт хотя бы один раз.
Еще один способ сказать это: взять клиентов, которые купили fries
хотя бы один раз, и для всех из них вычислить A) сумму продажстоимость, потраченная на fries
и B) сумма продаж, потраченная на food
.
Промежуточная таблица будет иметь следующий вид:
product category sum_spent_on_product sum_spent_on_category ratio
by_people_buying_product
aerosol air_care 29 39 0.74
perfume air_care 21 31 0.68
burger food 13 22 0.59
fries food 15 28 0.53
Пример: люди, купившиеaerosol
хотя бы раз потратил 1800 на этот продукт.Те же самые люди потратили 3600 на категорию air_care
(к которой относится aerosol
).Таким образом, соотношение для aerosol
составляет 0,5.
Я пытался решить эту проблему с помощью left join lateral
и вычислять заданные промежуточные результаты для каждого product
, но не могу обернуть головувокруг того, как включить условие only for customers who bought this specific product
:
select
distinct (product_id)
, category
, c.sales_category
from transactions t
left join lateral (
select
sum(sales_value) as sales_category
from transactions
where category = t.category
group by category
) c on true
;
Приведенный выше запрос перечисляет сумму, потраченную на категорию продукта для каждого продукта, но без обязательного условия продукта-покупателя.
left join lateral
правильный путь?Есть ли другое решение в простом SQL?