奇怪的计算表上的数据

时间:2014-06-19 21:20:15

标签: sql tsql plsql sybase

我有一张这样的表

Table1(A,B)

A    B
3    0
4    3
2    2
0    1
3    5
4    6
.    .
.    .
.    .
.    .

它有大约300万行。我想计算一下:

A_SUM = 3 *(3 + 2 + 1 + 5 + 6 + .......)+ 4 *(2 + 1 + 5 + 6 + ........)+ 2 * (1 + 5 + 6 + ...)+ 0 *(5 + 6 + ...) + 3 *(6 + ...)+ ........

B_SUM = 0 *(4 + 2 + 0 + 3 + 4 + .......)+ 3 *(2 + 0 + 3 + 4 + ........)+ 2 * (0 + 3 + 4 + ...)+ 1 *(3 + 4 + ...) + 5 *(4 + ...)+ ............

如何计算这些数据?

1 个答案:

答案 0 :(得分:4)

你可以用累积金额做你想做的事。以下语法是ANSI标准,应该可以使用(取决于数据库的版本):

select sum(a*(revcumb - b)) as a_sum, sum(b*(revcuma - a)) as b_sum
from (select t.*,
             sum(b) over (order by id desc) as revcumb,
             sum(a) over (order by id desc) as revcuma
      from table t
     ) t;

请注意,这不是使用rows betweenrange between,而是从(反向)累积总和中减去当前行中的值。

另请注意,这假定存在id列或其他列以指定行的顺序。 SQL表本质上是无序的,因此当需要时,需要一个列来指定排序。

并且,如果您没有累积总和(即SQL Server< 2012),那么您可以使用相关子查询执行相同的操作。

编辑:

Sybase可能支持也可能不支持上述内容。这个数据库有很多不同的版本,作为标签几乎没有任何价值。我认为这适用于大多数版本:

select sum(a*revcumb) as a_sum, sum(b*revcuma) as b_sum
from (select t.*,
             (select sum(b) from table t2 where t2.id > t.id) as revcumb,
             (select sum(a) from table t2 where t2.id > t.id) as revcuma
      from table t
     ) t;