2014-03-03 59 views
4

我在Oracle数据库中有一个表,其中包含以下感兴趣的字段:位置,产品,日期,金额。我想编写一个查询,按地点,产品和日期获得总计金额。我在下面列出了一个我希望得到的结果的示例表。按组SQL运行总计(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  | 
+----------+---------+-----------+------------+------------+ 

回答

2

啊,我想我已经想通了。

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

我可以输出所有的答案,或者将您发送到我了解的地方。 :)

检查了这一点,它解释了你正在尝试做什么。

http://www.codeproject.com/Articles/300785/Calculating-simple-running-totals-in-SQL-Server

+0

您没有找到解释如何分区数据的文章有用吗?虽然答案是分区。 –

+0

我没有downvote这个答案,但我认为肯定有改进的余地。也许考虑增加更多的上下文/内容 - 似乎对SO有共识,[仅有链接不足以获得好的答案](http://meta.stackexchange.com/questions/7515/why-is-linking-bad )。 – crennie

+0

另外,这个链接可能更适合作为评论而不是答案......但不幸的是,你需要50个代表。如果你像我一样,你认为这是蹩脚的,那么请查看[这个关于它的问题](http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation ),这给出了一些动机的限制,并且还提出了一些写出好的答案的方法:D – crennie

1

从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