У меня есть следующие таблицы:
users
+-------+-----------+-----------+
| id | source | age_group |
+-------+-----------+-----------+
| 1 | google | 18 - 22 |
+-------+-----------+-----------+
| 2 | facebook | 22 - 25 |
+-------+-----------+-----------+
| 3 | site | 25 - 35 |
+-------+-----------+-----------+
| 4 | google | 25 - 35 |
+-------+-----------+-----------+
| 5 | google | 18 - 22 |
+-------+-----------+-----------+
orders
+-------+-----------+
| id | userId |
+-------+-----------+
| 1 | 3 |
+-------+-----------+
| 2 | 1 |
+-------+-----------+
| 3 | 3 |
+-------+-----------+
| 4 | 2 |
+-------+-----------+
| 5 | 4 |
+-------+-----------+
| 6 | 5 |
+-------+-----------+
orders_payments:
+-------+-----------+-----------+
| id | orderId | amount |
+-------+-----------+-----------+
| 1 | 1 | 10 |
+-------+-----------+-----------+
| 2 | 2 | 0 |
+-------+-----------+-----------+
| 3 | 3 | 40 |
+-------+-----------+-----------+
| 4 | 5 | 0 |
+-------+-----------+-----------+
| 5 | 6 | 0 |
+-------+-----------+-----------+
И 3 варианта:
- Заказ сделан пользователем и оплачен (сумма orders_payments> 0)
- Пользователь попробовал бесплатный сервис (сумма orders_payments = 0)
- Пользователь разместил заказ, но не появился (нет записи в orders_payments)
Мне нужен отчет о продажах, который выглядит следующим образом:
+-----------+-----------+-----------+-----------+-----------+
| source | age_group | paid | tried | no_show |
+-----------+-----------+-----------+-----------+-----------+
| google | 18 - 22 | 0 | 2 | 0 |
+-----------+-----------+-----------+-----------+-----------+
| google | 25 - 35 | 0 | 1 | 0 |
+-----------+-----------+-----------+-----------+-----------+
| facebook | 22 - 25 | 0 | 0 | 1 |
+-----------+-----------+-----------+-----------+-----------+
| site | 25 - 35 | 1 | 0 | 0 |
+-----------+-----------+-----------+-----------+-----------+
Последние 3 столбца представляют количество пользователей, которые хотя бы раз заплатили, попробовали бесплатные услуги или не явились на встречу.
Отчет сгруппирован по источник, а затем по возрастной группе. Итак, что-то вроде этого
SELECT source, age_group, ... FROM users GROUP BY source, age_group
Я не могу, ради моей жизни, понять это.
Любые идеи очень ценятся.
Спасибо!
LE: Я хочу посчитать пользователей только один раз. Так что, если у них есть два оплаченных заказа, я считаю их один раз как оплаченные, если опробованные, но затем оплаченные, я также хочу считать их один раз как оплаченные и т. Д.
LE2: Я думаю, что это возможное решение:
select
u.source,
u.age_group,
sum(op.amount > 0) paid,
sum(op.amount = 0) tried,
sum(op.orderId is null) no_show
from users u
inner join orders o on o.userId = u.id
left join (
select max(amount) as amount, orderId
from orders_payments
left join orders on orders_payments.orderId = orders.id
group by orders.userId
) op on op.orderId = o.id
group by u.source, u.age_group
order by u.source, u.age_group