按组 SQL 运行总计 (Oracle)
Posted
技术标签:
【中文标题】按组 SQL 运行总计 (Oracle)【英文标题】:Running Total by Group SQL (Oracle) 【发布时间】:2014-04-05 00:15:53 【问题描述】:我在 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 |
+----------+---------+-----------+------------+------------+
【问题讨论】:
【参考方案1】:啊,我想我已经想通了。
select a.*, sum(Amount) over (partition by Location, Product order by Date) as Running_Amt
from Example_Table a
【讨论】:
【参考方案2】:我可以把所有答案都打出来,或者把你送到我学过的地方。 :)
看看这个,它准确地解释了你想要做什么。
http://www.codeproject.com/Articles/300785/Calculating-simple-running-totals-in-SQL-Server
【讨论】:
您没有发现解释如何对数据进行分区的文章有用吗?虽然答案是分区。 我没有否决这个答案,但我认为肯定有改进的余地。也许考虑添加更多上下文/内容 - 似乎对links alone are not sufficient for a good answer达成共识。 顺便说一句,这个链接可能更适合作为评论而不是答案......但不幸的是,您需要 50 个代表。如果您像我一样认为那很蹩脚,那么请查看this question about it on meta,它为限制提供了一些动力,并提出了一些写出好答案的方法:D 链接的文章适用于 SQL Server。 Oracle 使用窗口函数可以更有效地执行此操作。 感谢您花时间批评我解决问题的答案。非常感谢您提到 oracle 有一种更有效的方法,但没有费心回答这个问题。如果您实际上提供了一些有关有效方式的说明,那将会更有帮助。我引用的答案在 oracle 中的工作方式与在 SQL Server 中的工作方式相同。【参考方案3】:来自 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
【讨论】:
以上是关于按组 SQL 运行总计 (Oracle)的主要内容,如果未能解决你的问题,请参考以下文章