$ man sum-over
SUM() OVER(累計)
ウィンドウ関数集約関数をウィンドウ関数として使う。ORDER BY を付けるかどうかで、累計か総計かが変わる。
呼び出しの形
SUM(式) OVER (ORDER BY 式) SUM(式) OVER (PARTITION BY 式 ORDER BY 式) SUM(式) OVER ()
つまずきやすいところ
ORDER BYの有無で総計と累計が入れ替わります。 書き忘れると、全行が同じ値(総計)になります。既定のフレームは
RANGEなので、ORDER BYの値が同じ行はまとめて加算されます。1 行ずつ積みたいならROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWと書いてください。SUM(COUNT(*)) OVER (...)のように、集約の結果にウィンドウ関数を重ねられます。この場合ウィンドウ関数はGROUP BYの後に評価されます。ROWSで 1 行ずつ積むときは、ORDER BYを一意になるまで書いてください。同値があると積む順番が決まらず、実行のたびに途中の値が変わりえます。
実行例
結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。
SELECT juchu_on, COUNT(*) AS kensu, SUM(COUNT(*)) OVER (ORDER BY juchu_on) AS ruikei, SUM(COUNT(*)) OVER () AS soukei FROM juchu GROUP BY juchu_on ORDER BY juchu_on
| juchu_on | kensu | ruikei | soukei |
|---|---|---|---|
| 2025-11-05 | 1 | 1 | 10 |
| 2025-11-18 | 1 | 2 | 10 |
| 2025-12-02 | 1 | 3 | 10 |
| 2025-12-09 | 1 | 4 | 10 |
| 2025-12-24 | 1 | 5 | 10 |
| 2026-01-07 | 1 | 6 | 10 |
| 2026-01-21 | 1 | 7 | 10 |
| 2026-02-03 | 1 | 8 | 10 |
10 行(うち 8 行を表示)
ORDER BY を書いた列だけが累計になります。書かない側はどの行でも同じ値です。
SELECT juchu_id, gyo_no, suryo, SUM(suryo) OVER (PARTITION BY juchu_id ORDER BY gyo_no) AS juchu_nai_ruikei FROM juchu_meisai ORDER BY juchu_id, gyo_no
| juchu_id | gyo_no | suryo | juchu_nai_ruikei |
|---|---|---|---|
| 1001 | 1 | 20 | 20 |
| 1001 | 2 | 30 | 50 |
| 1002 | 1 | 2 | 2 |
| 1002 | 2 | 1 | 3 |
| 1003 | 1 | 4 | 4 |
| 1003 | 2 | 2 | 6 |
| 1004 | 1 | 5 | 5 |
| 1005 | 1 | 10 | 10 |
17 行(うち 8 行を表示)
SELECT shohin_id, juchu_id, gyo_no, suryo, SUM(suryo) OVER (ORDER BY shohin_id) AS range_de_matomete, SUM(suryo) OVER (ORDER BY shohin_id, juchu_id, gyo_no ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rows_de_ichigyou_zutsu FROM juchu_meisai ORDER BY shohin_id, juchu_id, gyo_no
| shohin_id | juchu_id | gyo_no | suryo | range_de_matomete | rows_de_ichigyou_zutsu |
|---|---|---|---|---|---|
| 1 | 1001 | 1 | 20 | 80 | 20 |
| 1 | 1005 | 1 | 10 | 80 | 30 |
| 1 | 1008 | 1 | 50 | 80 | 80 |
| 2 | 1001 | 2 | 30 | 152 | 110 |
| 2 | 1005 | 2 | 0 | 152 | 110 |
| 2 | 1006 | 1 | 30 | 152 | 140 |
| 2 | 1010 | 2 | 12 | 152 | 152 |
| 4 | 1002 | 1 | 2 | 160 | 154 |
17 行(うち 8 行を表示)
shohin_id が同じ行は、既定(RANGE)では一度に足されるので同じ値が続きます。右の列は ROWS を明示し、並びも一意にしてあるので 1 行ずつ増えます。
説明
SUM などの集約関数は OVER を付けると行をまとめずに計算できます。元の行を残したまま、合計や累計を横に並べられます。
⚠️ ORDER BY を書くかどうかで意味がまるで変わります。
SUM(x) OVER ()… 全体の総計。どの行でも同じ値SUM(x) OVER (ORDER BY d)… 先頭からその行までの累計
これは、ORDER BY を書くとフレームの既定が「最初から現在行まで」に変わるためです。書き忘れると総計、書いたつもりで並び順が曖昧だと累計がずれる——どちらも起きます。
⚠️ さらに落とし穴があります。既定のフレームは RANGE なので、ORDER BY の値が同じ行は、まとめて一度に加算されます。1 行ずつ積み上げたいなら ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW と明示してください。
ほかの製品でも通るか
未確認の製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database
未確認: IBM Db2
次に読む
関係する関数
根拠にした一次情報
- PostgreSQL 18 マニュアル: ウィンドウ関数(2026-09-02 確認)
- PostgreSQL 18 マニュアル: ウィンドウ関数の呼び出し(フレーム指定)(2026-09-02 確認)