1

我仍然无法根据值的递增顺序创建运行总计。Row id 没有实际意义,它只是PK。我的服务器不支持OVER。

Row Value
1 3
2 7
3 1
4 2

结果:

Row Value
3 1
4 3
1 6
2 13

我已经尝试过自我连接和交叉连接,我指定第二个数量的值(被总结的那个)小于第一个的当前值。我也尝试过使用 having 子句来执行此操作,但是当我以这种方式尝试时总是会引发错误。有人可以解释为什么以这种方式使用它是错误的以及我应该怎么做?

4

3 回答 3

2

以下是计算总和的一种方法:

select row, value,
       (select sum(value) from t t2 where t2.value <= t.value) as runningTotal
from t
于 2012-09-05T14:25:40.340 回答
0

如果你的平台支持递归查询(IIRC 你应该省略微软东西的 RECURSIVE 关键字)。因为 CTE 需要估计“链”的开始/结束,不幸的是,元组需要以某种方式排序(我使用“行”字段;内部 tuple-id 非常适合此目的):

WITH RECURSIVE sums AS (
    -- Terminal part
    SELECT  d0.row
    , d0.value AS value
    , d0.value AS runsum
    FROM data d0
    WHERE NOT EXISTS (
        SELECT * FROM data nx
        WHERE nx.row < d0.row
        )
    UNION
    -- Recursive part
    SELECT  t1.row AS row
    , t1.value AS value
    , t0.runsum + t1.value AS runsum
    FROM data t1
    , sums t0
    WHERE t1.row > t0.row
    AND NOT EXISTS (
        SELECT * FROM data nx
        WHERE nx.row > t0.row
        AND nx.row < t1.row
        )
    )
SELECT * FROM sums
    ;

结果:

 row | value | runsum 
-----+-------+--------
   1 |     3 |      3
   2 |     7 |     10
   3 |     1 |     11
   4 |     2 |     13
(4 rows)
于 2012-09-05T16:33:25.367 回答
0

如果你有 sql server 2008,你可以使用 with rollup 命令。

select sum(value) from t t2 where t2.value <= t.value with rollup
于 2012-09-05T14:33:29.210 回答