Процент от общей суммы покупки для соответствующих клиентов за период даты - PullRequest
0 голосов
/ 28 марта 2020

Мне нужно найти процент проданных шоколадом покупателей, которые покупали шоколад по месяцам. Возьмем, к примеру, приведенный ниже пример таблицы с единственной записью месяца:

Cust_Id     Customer    Quantity    Item        Amount in $     Date         Month and year
1           Maria       2           chocolate   10                 01/01/2020   1-2020
1           Maria       1           banana      5                  01/01/2020   1-2020
1           Maria       3           cookies     3                  01/01/2020   1-2020
2           Carlos      5           cookies     10                 01/01/2020   1-2020
2           Carlos      3           banana      3                  01/01/2020   1-2020
3           Jose        1           banana      5                  01/01/2020   1-2020
3           Jose        1           chocolate   3                  01/01/2020   1-2020
4           Anne        10          chocolate   20                 01/01/2020   1-2020
4           Anne        1           banana      5                  01/01/2020   1-2020
4           Anne        10          cookies     15                 01/01/2020   1-2020

Из тех покупателей, которые приобрели шоколад в январе 2020 года (Мария, Хосе и Анна, но НЕ Карлос ), сколько из общей суммы покупки (в%) было на шоколад?

Решение с помощью сводной таблицы в Excel:

Month   1 2020
Customer Name   SUM of Amount in $  Total amount of purchase    Overall %
Anne            20                  40  
Jose            3                   8   
Maria           10                  18  
Grand Total     33                  66                         50.00%

Решение для даты '1-2020': 50%

Как определить процент шоколадных конфет, проданных за период даты, только для клиентов, которые приобрели шоколад в этот период, с помощью SQL?

mysql> select * from orders where date = '1-2020';
+----------+-------------+---------------+----------+-----------+--------+--------+
| order_id | customer_id | customer_name | quantity | item      | amount | date   |
+----------+-------------+---------------+----------+-----------+--------+--------+
|        1 |           1 | Maria         |        2 | chocolate |     10 | 1-2020 |
|        2 |           1 | Maria         |        1 | banana    |      5 | 1-2020 |
|        3 |           1 | Maria         |        3 | cookies   |      3 | 1-2020 |
|        4 |           2 | Carlos        |        5 | cookies   |     10 | 1-2020 |
|        5 |           2 | Carlos        |        3 | banana    |      3 | 1-2020 |
|        6 |           3 | Jose          |        1 | banana    |      5 | 1-2020 |
|        7 |           3 | Jose          |        1 | chocolate |      3 | 1-2020 |
|        8 |           4 | Anne          |       10 | chocolate |     20 | 1-2020 |
|        9 |           4 | Anne          |        1 | banana    |      5 | 1-2020 |
|       10 |           4 | Anne          |       10 | cookies   |     15 | 1-2020 |
+----------+-------------+---------------+----------+-----------+--------+--------+
10 rows in set (0.00 sec)

Приведенный ниже запрос почти верен, только он показывает, что общая сумма за январь составляет 79 долларов США, когда правильная сумма равна 66 долларам (в январе Карлос не покупал шоколад)

mysql> select date,     sum(case when item = 'chocolate' then amount end) as chocolate_amount,     sum(amount) as total_amount,     (sum(case when item = 'chocolate' then amount end) / sum(amount)) as percentage from orders where date = '1-2020' group by date having sum(case when item = 'chocolate' then 1 else 0 end) > 0;
+--------+------------------+--------------+------------+
| date   | chocolate_amount | total_amount | percentage |
+--------+------------------+--------------+------------+
| 1-2020 |               33 |           79 |     0.4177 |
+--------+------------------+--------------+------------+
1 row in set (0.00 sec)

Опять же, правильный расчет здесь будет быть 33/66 = 50% Спасибо

Ответы [ 2 ]

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

Благодаря Гордону Линоффу я смог изменить его запрос, чтобы получить нужный мне результат. Хотя это не на 100% правильно, его запрос поставил меня на правильный путь.

Для всех, кто интересуется запросом и результатом:

Запрос

select o.date,
    sum(case when item = 'chocolate' then amount end) as chocolate_amount,
    t2.total_purchases,
    (sum(case when item = 'chocolate' then amount end) / t2.total_purchases) as percentage
from orders o
join (
    select date, sum(amount) as total_purchases
        from orders o1
        join (
            select distinct date, customer_id 
            from orders o2
            where item = 'chocolate'
        ) as chocolate_customers
using (date)
where o1.customer_id in (chocolate_customers.customer_id)
group by 1
) as t2 using (date)
group by date
having sum(case when item = 'chocolate' then 1 else 0 end) > 0;

Результат

+--------+------------------+-----------------+------------+
| date   | chocolate_amount | total_purchases | percentage |
+--------+------------------+-----------------+------------+
| 1-2020 |               33 |              66 |     0.5000 |
| 2-2020 |               10 |              15 |     0.6667 |
| 3-2020 |               55 |              62 |     0.8871 |
+--------+------------------+-----------------+------------+
3 rows in set (0.00 sec)

Еще раз спасибо

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

Вы можете использовать условное агрегирование:

select customer, 
       sum(case when item = 'chocolate' then amount end) as chocolate_amount,
       sum(amount) as total_amount,
       (sum(case when item = 'chocolate' then amount end) /
        sum(amount)
       ) as chocolate_ratio
from t
where date >= '2020-01-01' and date < '2020-02-01'
group by customer
having sum(case when item = 'chocolate' then 1 else 0 end) > 0
...