按组SQL运行总计(Oracle)

use*_*699 5 sql oracle running-total

我在Oracle数据库中有一个表,其中包含以下感兴趣的字段:位置,产品,日期,金额.我想编写一个查询,按位置,产品和日期获得总计金额.我在下面给出了一个示例表,我希望得到的结果是什么.

我可以得到一个总计,但是当我到达一个新的位置/产品时我无法重置它.这是我到目前为止的代码,任何帮助都会非常感激,我觉得这是一个简单的修复.

select a.*, sum(Amount) over (order by Location, Product, Date) as Running_Amt
from Example_Table a

+----------+---------+-----------+------------+------------+
| Location | Product | Date      | Amount     |Running_Amt |
+----------+---------+-----------+------------+------------+
| A        | aa      | 1/1/2013  | 100        | 100        |
| A        | aa      | 1/5/2013  | -50        | 50         |
| A        | aa      | 5/1/2013  | 100        | 150        |
| A        | aa      | 8/1/2013  | 100        | 250        |
| A        | bb      | 1/1/2013  | 500        | 500        |
| A        | bb      | 1/5/2013  | -100       | 400        |
| A        | bb      | 5/1/2013  | -100       | 300        |
| A        | bb      | 8/1/2013  | 250        | 550        |
| C        | aa      | 3/1/2013  | 550        | 550        |
| C        | aa      | 5/5/2013  | -50        | 600        |
| C        | dd      | 10/3/2013 | 999        | 999        |
| C        | dd      | 12/2/2013 | 1          | 1000       |
+----------+---------+-----------+------------+------------+
Run Code Online (Sandbox Code Playgroud)

use*_*699 11

啊,我想我已经想通了。

select a.*, sum(Amount) over (partition by Location, Product order by Date) as Running_Amt
from Example_Table a
Run Code Online (Sandbox Code Playgroud)


nic*_* m. 5

来自 Oracle 10g 书中的高级 SQL 函数,它有这个例子。

SELECT dte "Date", location, receipts,
SUM(receipts) OVER(ORDER BY dte
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) "Running total"
FROM store
WHERE dte < '10-Jan-2006'
ORDER BY dte, location
Run Code Online (Sandbox Code Playgroud)