コマンド道場
集約関数のウィンドウ化難易度 ★★★★★

全体に占める割合を出す

取消されていない受注(status が done)について、受注ごとの金額(明細の 数量 × 単価 の合計)と、それが全体の合計に占める割合(パーセント)を取り出してください。割合は小数第 1 位まで四捨五入します。列名はそれぞれ kingaku、wariai で、列は「juchu_id, kingaku, wariai」の順、金額の高い順に並べてください。

この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database

未確認: IBM Db2

製品ごとの対応表(実測)を見る

  • OVER () と範囲を指定しなければ、結果全体が 1 つのまとまりになります。合計に対する割合はこの形で出せます。
  • 整数どうしの割り算は切り捨てられる製品があります。100.0 のように小数を混ぜると小数として計算されます。
● 起動中…

この問題で使えるテーブル(名前をタップすると入力できます)

10

NULL
🔑int不可
int不可
date不可
text不可
データを見る(先頭 5 行)
juchu_idkokyaku_idjuchu_onstatus
100112025-11-05done
100222025-11-18done
100312025-12-02done
100432025-12-09cancel
100542025-12-24done

17

NULL
🔑int不可
🔑int不可
int不可
int不可
numeric(10,0)不可
データを見る(先頭 5 行)
juchu_idgyo_noshohin_idsuryotanka
10011120180
10012230120
100214223800
100225118500
10031644200

5

NULL
🔑int不可
text不可
text
date不可
データを見る(先頭 5 行)
kokyaku_idkokyaku_nameprefcreated_on
1青葉工業東京都2024-05-10
2白樺物産大阪府2024-08-01
3黒松システム東京都2025-01-15
4赤坂商会NULL2025-03-20
5三田商事愛知県2025-06-01

7

NULL
🔑int不可
text不可
text不可
numeric(10,0)不可
データを見る(先頭 5 行)
shohin_idshohin_namecategoryprice
1ノート文具180
2ボールペン文具120
3付箋文具250
4デスクチェア家具24800
5書棚家具18500

解説

結論

OVER () は結果全体を 1 つのまとまりとして扱います。

なぜ

ウィンドウの範囲を指定しなければ、区切りが無い=全行が 1 つのまとまりになります。したがって sum(...) OVER () は全体の合計を返し、各行からその値を参照できます。全体比・構成比・偏差といった「全体との比較」がこの形で書けます。

副問い合わせで合計を別に求めても同じ結果になりますが、走査が 1 回で済む点と、集計とその比較が 1 か所にまとまる点で読みやすくなります。

整数どうしの割り算は切り捨てられることがあります。100.0 のように小数を混ぜて計算してください。

よくある間違い

①集計前の絞り込みを忘れる ②整数のまま割って 0 になる。

根拠(一次情報)