web-dev-qa-db-ja.com

グループ化せずにSUMを作成する方法

これが私の問題です。

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のソリューションを知っている人がいれば問題ありません。

12
Aijaz Chauhan

ウィンドウ関数を使用するには-が必要です http://www.postgresql.org/docs/9.3/static/tutorial-window.html

何かのようなもの:

(Sum(Auction) OVER ()) - actual AS Remaining
16
Idan Arye

Idanは100%正解です。これについて説明したいと思います。

_(SUM (Auction) OVER ())
_
  • OVER ()は、元のクエリからすべての行を含むwindowを作成します。
  • SUM (Auction)は、Auctionの合計を計算するウィンドウ関数です。

ここにさらに説明があります:

  • Windowは、クエリ結果セット内のユーザー指定の行のセットです。

  • Window関数は、ウィンドウ内のすべての行の値(例:SUM)を計算します。

  • OVER()には_PARTITION BY_が含まれていないため、すべての行はウィンドウ内にあります。 _PARTITION BY_を使用すると、ウィンドウに行のサブセットが含まれます。

MSDNから

... OVER句は、クエリ結果セット内のウィンドウまたはユーザー指定の行セットを定義します。次に、ウィンドウ関数がウィンドウの各行の値を計算します。関数でOVER句を使用して、集計値を計算できます... OVER句にPARTITION BYが含まれていない場合。つまり、関数はクエリによって返されるすべての行に適用されます。

7
Shaun Luttin