MySQL Отчет о продажах - PullRequest
       19

MySQL Отчет о продажах

1 голос
/ 06 марта 2020

У меня есть следующие таблицы:

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 варианта:

  1. Заказ сделан пользователем и оплачен (сумма orders_payments> 0)
  2. Пользователь попробовал бесплатный сервис (сумма orders_payments = 0)
  3. Пользователь разместил заказ, но не появился (нет записи в 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

1 Ответ

0 голосов
/ 06 марта 2020

Я бы go для left join в таблице платежей, а затем условное агрегирование.

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 orders_payments op on op.orderId = o.id
group by u.source, u.age_group
order by u.source, u.age_group
...