2013-10-09 20 views
8

这里是我的问题..如何使无组总和

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中的解决方案,那就没问题了。

+0

'(sum(auction)-actual)'没有意义。应该是'实际 - 总和(拍卖)'。 –

回答

12

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

喜欢的东西:

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

非常感谢你......我也想问一下,如何在SQL中处理这个问题? –

+1

SQL Server也具有此功能,语法相同:http://technet.microsoft.com/en-us/library/ms189461.aspx –

+1

我认为它应该是'actual - Sum(Auction)OVER(PARTITION BY id )剩下的 –

5

伊詹是100%正确的。我想提供这样一个解释:

(SUM (Auction) OVER()) 
  • OVER()创建窗口包括所有行从原来的查询。
  • SUM (Auction)是一个窗口函数,计算Auction的总和。

下面是进一步说明:

  • 窗口是查询结果集内的用户指定的行的集合。

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

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

From MSDN

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