如果sample
表中有多个行每个人需要总结多个数量,你可以使用:
select curr.person, curr.sum_person + case when prev.person <> curr.person
then prev.sum_person
else 0 end as person_sum
from (select person, sum(quantity) as sum_person
from sample
group by person) curr
cross join (select person, sum(quantity) as sum_person
from sample
group by person) prev
where prev.person =
(select max(x.person) from sample x where x.person < curr.person)
or curr.person = (select min(person) from sample)
group by curr.person
小提琴:http://sqlfiddle.com/#!2/7c3135/6/0
输出:
| PERSON | PERSON_SUM |
|--------|------------|
| A | 1 |
| B | 3 |
| C | 5 |
| D | 7 |
| E | 9 |
如果每人只有一个行的sample
表,你可以更简单地使用:
select curr.person, curr.quantity + case when prev.person <> curr.person
then prev.quantity
else 0 end as person_sum
from sample curr
cross join sample prev
where prev.person =
(select max(x.person) from sample x where x.person < curr.person)
or curr.person = (select min(person) from sample)
group by curr.person
小提琴:http://sqlfiddle.com/#!2/7c3135/8/0
Ou返回的tput是一样的,因为在你的例子中,每个人只有一行。
如果使用的是Oracle,SQL Server或支持分析功能的数据库,你可以使用:
如果sample
的人均一行:
select person,
sum(quantity) over(order by person rows between 1 preceding and current row) as your_sum
from sample
order by person
小提琴:http://sqlfiddle.com/#!4/82e6f/1/0
如果sample
每人有2+行:
select person,
sum(sum_person) over(order by person rows between 1 preceding and current row) as your_sum
from (select person, sum(quantity) as sum_person
from sample
group by person) x
order by person
小提琴:http://sqlfiddle.com/#!4/82e6f/4/0
难道一个人有2个+行多数量需要总结?我问,因为,如果不是,你的查询实际上不涉及SUM函数。相反,你只是在水平上添加两个值。 – 2015-02-07 14:18:37
你正在使用哪些DBMS? Postgres的?甲骨文? – 2015-02-07 16:03:39
我使用Apache Derby – user3133542 2015-02-07 16:40:55