2015-02-07 121 views
0

让有下面的示例表:SQL:列总和

Person Quantity 
A  1 
B  2 
C  3 
D  4 
E  5 

的结果应该是:

PersonAggregate 
1  (0+Quantity of PersonA)=sumA 
3  (sumA+Quantity of PersonB)=sumB 
6  (sumB+Quantity of PersonC)=sumC 
10 (sumC+Quantity of PersonD)=sumD 
15 (sumD+Quantity of PersonE) 

是否有可能得到这个结果的OnQ SQL查询?

+0

难道一个人有2个+行多数量需要总结?我问,因为,如果不是,你的查询实际上不涉及SUM函数。相反,你只是在水平上添加两个值。 – 2015-02-07 14:18:37

+0

你正在使用哪些DBMS? Postgres的?甲骨文? – 2015-02-07 16:03:39

+0

我使用Apache Derby – user3133542 2015-02-07 16:40:55

回答

3

大多数版本的SQL支持累计总和作为窗口函数的:

select person, sum(quantity) over (order by person) as cumesum 
from sample; 

您还可以可以用相关子查询做到这一点:

select s.person, 
     (select sum(s2.quantity) 
     from samples s2 
     where s2.person <= s.person 
     ) as cumesum 
from sample s; 
1

这显然会得到个人总和。

select person, sum(quantity) 
from sample 
group by person 
order by person 

我不认为你想要的效果可以以基于集合的方式完成。像T-SQL或PLSQL这样的使用游标的程序语言可以轻松完成。

我会写一个存储过程并调用它。

0

如果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