2014-10-04 43 views
1

我有以下查询返回的数据集是以下,我显示下面的一些行,但返回的实际数据超过500k行。如何写余下的总计oracle31 sql查询

Date   | amount 
01-01-2010 | 200 
01-02-2010 | 50 
01-03-2010 | 400 
01-04-2010 | 50 
01-05-2010 | 0 
01-06-2010 | 0 
01-07-2010 | 100 

我想查询返回剩余金额列是这样的:

Date   | amount | Remaining 
01-01-2010 | 200  | 600 
01-02-2010 | 50  | 550 
01-03-2010 | 400  | 150 
01-04-2010 | 50  | 100 
01-05-2010 | 0  | 100 
01-06-2010 | 0  | 100 
01-07-2010 | 100  | 0 

剩余量开始与总量,这是所有的记录量列的总和的总和。

+0

“剩余”起始值来自哪里,“总和”? – sgeddes 2014-10-04 04:39:49

+0

剩余价值开始于总金额之和 – gpa 2014-10-04 04:48:12

回答

1

可以使用Oracle分析函数

SELECT DATE, 
    AMOUNT, 
    (SUM (AMOUNT) OVER()) - (SUM (AMOUNT) OVER (ORDER BY DATE)) 
     AS REMAINING 
FROM TABLE 
2

下面是一个使用相关子查询的一种方法与​​3210:

select y.dt, 
    y.amount, 
    coalesce((select sum(amount) 
    from yourtable y2 
    where y2.dt > y.dt),0) as remaining 
from yourtable y 
order by y.dt 
+0

使用窗口函数将比共同相关的子查询快得多 – 2014-10-04 10:26:21

3

您还可以使用Windowing Clause来避免SUM(AMOUNT) - (...)

SELECT dt, AMOUNT, 
    nvl(sum(amount) over 
     (order by dt desc rows between unbounded preceding and 1 preceding) 
    , 0) as REMAINING 
FROM yourtable 
order by dt 

使用分析功能应给予比相关子查询更好的性能,因为表扫描一次。