Не удается получить сумму последнего заказа за каждый день при использовании групп по и присоединений - PullRequest
0 голосов
/ 28 января 2020

У меня есть две таблицы orders и order_items. Мне нужно сгруппировать результаты по дням.

Но мне также нужно получить за каждый день:

  • 1) сумму order_items.energy_used для всех заказов, созданных в этот день
  • 2) сумма orders.order_sum для всех заказов, созданных в этот день
  • 3) последние created_at и order_sum, которые соответствуют последнему заказу, созданному в этот день

Я могу получить все, кроме последней суммы order_sum за каждый день.

Вот мой orders стол

+----+-----------+---------+---------------------+
| id | order_sum | user_id | created_at          |
+----+-----------+---------+---------------------+
| 1  | 25.13     | 7       | 2020-01-25 09:13:00 |
| 2  | 10.00     | 7       | 2020-01-25 15:23:00 |
| 3  | 14.00     | 5       | 2020-01-26 10:14:00 |
| 4  | 50.00     | 5       | 2020-01-26 19:14:00 |
| 5  | 35.00     | 1       | 2020-01-27 11:13:00 |
+----+-----------+---------+---------------------+

А вот мой order_items table

+----+----------+-------------+---------------------+
| id | order_id | energy_used | created_at          |
+----+----------+-------------+---------------------+
| 1  | 1        | 65          | 2020-01-25 09:13:00 |
| 2  | 1        | 12          | 2020-01-25 09:13:00 |
| 3  | 1        | 12          | 2020-01-25 09:13:00 |
| 4  | 2        | 70          | 2020-01-25 15:23:00 |
| 5  | 2        | 5           | 2020-01-25 15:23:00 |
| 6  | 3        | 0           | 2020-01-26 10:14:00 |
| 7  | 4        | 1           | 2020-01-26 19:14:00 |
| 8  | 5        | 5           | 2020-01-27 11:13:00 |
+----+----------+-------------+---------------------+

И это желаемый результат, которого я пытаюсь достичь

+---------------+-----------------+-------------------+---------------------+----------------+
| date_of_month | total_order_sum | total_energy_used | last_order_date     | last_order_sum |
+---------------+-----------------+-------------------+---------------------+----------------+
| 2020-01-25    | 35.13           | 164               | 2020-01-25 15:23:00 | 10.00          |
| 2020-01-26    | 64.00           | 1                 | 2020-01-26 19:14:00 | 50.00          |
| 2020-01-27    | 35.00           | 5                 | 2020-01-27 11:13:00 | 35.00          |
+---------------+-----------------+-------------------+---------------------+----------------+
select 
    date(o.created_at) date_of_month,
    sum(i.total_energy_used),
    max(o.created_at),
    sum(order_sum) as total_order_sum
from orders o
inner join (
    select order_id, sum(energy_used) total_energy_used
    from order_items i
    group by order_id
) i on o.id = i.order_id
group by date(o.created_at)

Я попытался добавить еще одно соединение, как это, но это не сработало

inner join (
    select
        date(created_at) as date_of_month,
        order_sum as last_order_sum
    from
        orders
    where
        created_at = (select max(created_at) from orders)
) as orders2 on orders2.date_of_month = orders.date_of_month

Ответы [ 3 ]

1 голос
/ 28 января 2020

попробуйте, как показано ниже, без необходимости подзапроса и используйте create_at в соединении

 select b.*,total_energy_used from 
(select a.*,o1.order_sum as last_order_sum from  (select date(created_at) as day,
sum(order_sum) as total_order_sum,
max(created_at) as last_order_date

from orders o group by day
) a join orders o1 on a.last_order_date = o1.created_at
) b
join 
(
select date(created_at) as d, sum(energy_used) total_energy_used
from order_items i
group by date(created_at)
) c on c.d=b.day
0 голосов
/ 28 января 2020

Спасибо P.Salmon за помощь, эта проблема была решена с помощью этого запроса

select 
    date(o.created_at) date_of_month,
    sum(order_sum) as total_order_sum,
    sum(i.total_energy_used) total_energy_used,
    max(o.created_at) lastorderdate,
    max(s.last_order_sum) last_order_sum
from orders o
inner join (
    select order_id, sum(energy_used) total_energy_used
    from order_items i
    group by order_id
) i on o.id = i.order_id
join
(select order_sum last_order_sum,created_at
    from orders o
    where created_at = (select max(created_at) from orders o1 where date(o1.created_at) = date(o.created_at))
) s on date(s.created_at) = date(o.created_at) 
group by date(o.created_at);
0 голосов
/ 28 января 2020

попробуйте этот запрос




SELECT                      
    date(o.created_at) date_of_month,
    SUM(i.total_energy_used),
    MAX(o.created_at),     
    solangi.order_sum as total_order_sum

FROM orders o              

LEFT OUTER JOIN (          

SELECT iii.*  FROM order_items AS iii WHERE iii.id = (SELECT ii.id FROM order_items ii WHERE ii.i.created_at= (SELECT MAX(i.created_at) FROM order_items i  GROUP BY  DATE( i.created_at  ) ORDER BY i.created_at  DESC))

) solangi ON solangi.id = o.id


GROUP BY DATE(o.created_at)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...