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)
来自 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)
| 归档时间: |
|
| 查看次数: |
29172 次 |
| 最近记录: |