按组 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)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 在字段更改时运行总计(仅在字段更改时对列求和)

Oracle Sql:如何在 sql 中添加多个子总计?

Oracle

Oracle SQL Pivot -- 获取行总计

如何用PL/SQL Developer连接ORACL数据库

SQL插入的唯一约束-ORACLE