MySQL, используя сумму для столбца, чтобы получить общую сумму для каждой группы

0

Это данные в табличных заказах.

Кто-нибудь может помочь мне сделать статистику?

-------------------------------
id  | order_amount | createtime
-------------------------------
1   |    10        | 1513605522
2   |    20        | 1513605523
3   |    30        | 1513605524
4   |    40        | 1513605525
-------------------------------
Это то, что мне нужно
-------------------------------
 total_income | createtime
-------------------------------
    10        | 1513605522
    30        | 1513605523
    60        | 1513605524
   100        | 1513605525
-------------------------------
, это мое выражение sql, оно не дает мне то, что я хочу.
select sum(order_amount) as total_income from order group by create time;

КСТАТИ. Можно ли производить выход.... Любая помощь для меня очень важна. Большое спасибо.
Теги:
group-by
sum
running-total

2 ответа

0
Лучший ответ

В MySQL вы можете сделать это, используя коррелированный подзапрос:

select o.*,
       (select sum(o2.order_amount)
        from orders o2
        where o2.createtime <= o.createtime
       ) as running_amount
from orders o;

Другой вариант - использование нестандартного SQL - использовать переменные:

select o.*, (@s := @s + o.order_amount) as running_amount
from (select o.*
      from orders o
      order by createtime
     ) o cross join
     (select @s := 0) params;

Обратите внимание, что подзапрос необходим только в более поздних версиях MySQL.

На самом деле MySQL 8.0, наконец, поддерживает функции окна, поэтому это можно сделать с использованием стандартного SQL в этой версии:

select o.*, sum(o.order_amount) over (order by o.createtime) as running_amount
from orders o;
  • 0
    Разве оконной функции не нужно что-то вроде ROWS UNBOUNDED PRECEDING ?
  • 0
    Это работает как шарм, братан. Я только что попробовал первое решение.
Показать ещё 1 комментарий
1

Ты можешь использовать:

set @amt := 0;
select @amt := @amt + order_amount as total_income, createtime
from order
order by createtime asc;
  • 0
    Заявление выглядит опрятным, и это работает также. Спасибо, приятель

Ещё вопросы

Сообщество Overcoder
Наверх
Меню