如何在没有分组的情况下制作SUM

时间:2013-10-09 12:11:24

标签: sql sql-server postgresql window-functions

这是我的问题..

Actual   Auction   Ammanat   id
7000     500       100       228,229
7000     100       100       228,229
7000     900       100       228,229
5000     0         0         230

我想要下面给出的结果

Actual   Auction   Ammanat   Remaining  id
7000     500       100       5550       228,229
7000     100       100       5550       228,229
7000     900       100       5550       228,229
5000     0         0         5000        230

此处Remaining(sum(auction)-actual)

我正在使用PostgreSQL。但是如果有人知道SQL Server中的解决方案,那就没关系了。

2 个答案:

答案 0 :(得分:15)

您需要使用窗口函数 - http://www.postgresql.org/docs/9.3/static/tutorial-window.html

类似的东西:

(Sum(Auction) OVER ()) - actual AS Remaining

答案 1 :(得分:7)

Idan 100%正确。我想提供一个解释:

(SUM (Auction) OVER ())
  • OVER ()从原始查询中创建窗口,包括所有行
  • SUM (Auction)窗口函数,用于计算Auction的总和。

以下是进一步说明:

  • 窗口是查询结果集中用户指定的一组行。

  • 窗口函数计算窗口中所有行的值(例如SUM)。

  • 所有行都在窗口中,因为OVER()不包含PARTITION BY。使用PARTITION BY窗口将包含行的子集。

From MSDN

  

... OVER子句定义查询结果集中的窗口或用户指定的行集。然后,窗口函数计算窗口中每行的值。您可以将OVER子句与函数一起使用来计算聚合值...如果OVER子句不包含PARTITION BY。这意味着该函数将应用于查询返回的所有行。