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

各行に部署平均を添える

部署に所属している社員それぞれについて、氏名・給与と、その社員が所属する部署の平均給与を取り出してください。退職者も含めます。平均は小数を四捨五入して整数にします。行はまとめず、社員 1 人につき 1 行にしてください。列名は平均が heikin で、列は「name, salary, heikin」の順、社員番号の小さい順に並べてください。

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

  • SQL Server では使えませんround(x)(引数 1 つ)
  • IBM Db2 では使えません集約関数の OVER(累計など)・ウィンドウ関数の PARTITION BY・round(x)(引数 1 つ)

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

  • 集約関数に OVER を付けると、行をまとめずに集計値を各行へ付けられます。ここが GROUP BY との決定的な違いです。
  • ⚠️ round(x) は SQL Server と Db2 では桁数の指定が必須です。round(x, 0) と書きます。
● 起動中…

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

7

NULL
🔑int不可
text不可
int
データを見る(先頭 5 行)
busho_idbusho_nameparent_busho_id
1経営NULL
2開発1
3営業1
4管理1
5基盤2

18

NULL
🔑int不可
text不可
int
int
numeric(10,0)不可
date不可
date
データを見る(先頭 5 行)
shain_idnamebusho_idjoushi_idsalaryhired_ontaishoku_on
1鈴木1NULL9800002014-04-01NULL
2佐藤217200002016-10-01NULL
3田中225200002019-04-01NULL
4中村225300002020-04-01NULL
5小林224450502024-04-01NULL

解説

結論

集約関数に OVER を付けると、行をまとめずに集計値を添えられます。

なぜ

GROUP BY は 1 グループ 1 行にまとめるので、個々の行の情報が失われます。ウィンドウ関数は元の行を保ったまま、指定した範囲での集計値を各行に付けます。「自分の値とグループの平均を並べて比べる」ことが 1 回の走査でできます。

同じことは相関副問い合わせでも書けますが、行ごとに副問い合わせを評価するため、行数が増えると差が出ます。

よくある間違い

①PARTITION BY を書かず全体平均になる ②GROUP BY と混同して行がまとまってしまう。

根拠(一次情報)