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

Aij*_*han 10 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
Run Code Online (Sandbox Code Playgroud)

我想要下面给出的结果

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
Run Code Online (Sandbox Code Playgroud)

在这里,Remaining(sum(auction)-actual).

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

Ida*_*rye 16

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

就像是:

(Sum(Auction) OVER ()) - actual AS Remaining
Run Code Online (Sandbox Code Playgroud)


Sha*_*tin 8

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

(SUM (Auction) OVER ())
Run Code Online (Sandbox Code Playgroud)
  • OVER ()创建一个窗口,其中包含原始查询中的所有行.
  • SUM (Auction)是一个计算总和的窗口函数Auction.

这是进一步的解释:

  • Window是查询结果集中用户指定的一组行.

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

  • 所有行都在窗口中,因为OVER()不包括PARTITION BY.随着PARTITION BY窗口将包括行的子集.

来自MSDN:

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