SUM OVER

累計の取得を行います。

-- Oracle
SUM ( sum_expression )
    OVER ( [ PARTITION BY partition_expression [,partition_expression ...] ]
    ORDER BY order_expression [,order_expression ...]
    [ ROWS row_spec | RANGE range_spec ] )

return : 累計
sum_expression : 集計を行う式
partition_expression : パーティションを指定する式
order_expression : 順位を決定するための式
row_spec : カレント行からどこまでを集計の範囲とするかを指定
range_spec : 範囲を指定

 

*
下記のテーブルがあるとき…

社員マスタ

社員番号 名前 所属部署コード 月給
1 しゃちょさん 100 1000000
2 部長さん 200 600000
3 主任さん 220 400000
4 Aさん 220 200000
5 Bさん 220 300000
6 Cさん 220 300000

 

*
社員マスタの給与の高い順に累計を参照する場合、以下のように記述します。

SELECT SUM(給与)OVER(ORDER BY 給与 DESC) AS "累計",
       社員番号, 名前, 所属部署コード, 給与
  FROM 社員マスタ
;

ROWS UNBOUNDED PRECEDINGをつけても同じ結果になります。

SELECT SUM(給与)OVER(ORDER BY 給与 DESC)
       ROWS UNBOUNDED PRECEDING AS "累計",
       社員番号, 名前, 所属部署コード, 給与
  FROM 社員マスタ
;

結果

累計 社員番号 名前 所属部署コード 月給
1000000 1 しゃちょさん 100 1000000
1600000 2 部長さん 200 600000
2000000 3 主任さん 220 400000
2600000 5 Bさん 220 300000
2600000 6 Cさん 220 300000
2800000 4 Aさん 220 200000

 

*
社員マスタの給与の高い順に累計を参照する場合、以下のように記述します。
(累計はその行よりも下の行の金額の累計を算出する)

SELECT SUM(給与)OVER(ORDER BY 給与 DESC
       RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS "累計",
       社員番号, 名前, 所属部署コード, 給与
  FROM 社員マスタ
;

結果

累計 社員番号 名前 所属部署コード 月給
2800000 1 しゃちょさん 100 1000000
1800000 2 部長さん 200 600000
1200000 3 主任さん 220 400000
800000 5 Bさん 220 300000
800000 6 Cさん 220 300000
200000 4 Aさん 220 200000

 

*
社員マスタの給与の高い順に累計を参照する場合、以下のように記述します。
(累計はその行よりも金額が±500,000の範囲の累計を算出する)

SELECT SUM(給与)OVER(ORDER BY 給与 DESC
       RANGE BETWEEN 500000 PRECEDING AND 500000 FOLLOWING) AS "累計",
       社員番号, 名前, 所属部署コード, 給与 
  FROM 社員マスタ
;

結果

累計 社員番号 名前 所属部署コード 月給
1600000 1 しゃちょさん 100 1000000
2800000 2 部長さん 200 600000
1800000 3 主任さん 220 400000
1800000 5 Bさん 220 300000
1800000 6 Cさん 220 300000
1800000 4 Aさん 220 200000

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です