2013-10-09 32 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。這意味着該函數將應用於查詢返回的所有行。