Mysql每行总和

时间:2014-09-14 14:37:25

标签: mysql sql

如何使用mysql获得如下结果?

> +--------+------+------------+
> | code   | qty  | total      |
> +--------+------+------------+
> |    aaa |   30 |         75 |
> |    bbb |   20 |         45 |
> |    ccc |   25 |         25 |
> +--------+------+------------+

总计是行的值以及之后的其他行。

3 个答案:

答案 0 :(得分:3)

您可以使用相关子查询执行此操作 - 假设排序是按字母顺序排列的:

select code, qty,
       (select sum(t2.qty)
        from mytable t2
        where t2.code >= t.code
       ) as total
from mytable t;

SQL表表示无序集。因此,表本身并没有后续行的概念。在您的示例中,代码是按字母顺序排列的,因此它们提供了一个定义。在实践中,通常会有一个id或创建日期用于此目的。

答案 1 :(得分:2)

我会使用join,imho通常更适合。

数据:

create table tab (
  code varchar(10),
  qty int
);

insert into tab (code, qty)
select * from (
  select 'aaa' as code, 30 as qty union
  select 'bbb', 20 union
  select 'ccc', 25
) t

查询:

select t.code, t.qty, sum(t1.qty) as total
from tab t
join tab t1 on t.code <= t1.code
group by t.code, t.qty
order by t.code

最好的方法是尝试两个查询(我和@Gordon提到的子查询)并选择更快的查询。

小提琴:http://sqlfiddle.com/#!2/24c0f/1

答案 2 :(得分:0)

考虑使用变量。它看起来像:

select code, qty, (@total := ifnull(@total, 0) + qty) as total
    from your_table
    order by code desc

...然后反向查询结果列表。

如果您需要纯SQL解决方案,您可以计算所有qty值的总和并将其存储在变量中。

另外,请查看:Calculate a running total in MySQL