【问题标题】:mysql using sum for a column to get total amount for each groupmysql 使用列的总和来获取每个组的总金额
【发布时间】:2018-05-31 21:49:21
【问题描述】:

这是orders表中的数据。

有没有人可以帮我做统计工作?

------------------------------------------- 编号 |订单金额 |创建时间 ------------------------------------------- 1 | 10 | 1513605522 2 | 20 | 1513605523 3 | 30 | 1513605524 4 | 40 | 1513605525 ------------------------------------------- 这是我需要的输出 ------------------------------------------- 总收入 |创建时间 ------------------------------------------- 10 | 1513605522 30 | 1513605523 60 | 1513605524 100 | 1513605525 ------------------------------------------- 这是我的 sql 语句,它没有给我我想要的。
select sum(order_amount) as total_income from order group by create time;

顺便提一句。是否可以产生输出.... 任何帮助对我来说都意义重大。非常感谢。

【问题讨论】:

  • 您遇到错误了吗?像“错误 1064 ,语法错误”之类的东西?
  • 完全没有错误,但是total_income的值不同
  • 请注意命名表'order',注意下面的答案将表命名为'orders'(带有-s),以免与SQL关键字ORDER混淆,如ORDER BY .
  • 哎呀,我没注意到,“订单”确实不是表格的有效名称。

标签: mysql sql group-by sum cumulative-sum


【解决方案1】:

你可以使用:

set @amt := 0;
select @amt := @amt + order_amount as total_income, createtime
from order
order by createtime asc;

【讨论】:

  • 语句看起来很整洁,而且效果也很好。谢谢,伙计
【解决方案2】:

在 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;

【讨论】:

  • 窗口函数不需要像ROWS UNBOUNDED PRECEDING这样的东西吗?
  • 它就像一个魅力,兄弟。我刚刚尝试了第一个解决方案。
  • @MatBailie 。 . .窗框子句应该是可选的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多