コマンド道場
GROUP BY 句難易度 ★★☆☆☆

部署ごとの平均給与を高い順に

在籍中の社員について、部署名と平均給与を求めてください。列は「部署名, 平均給与」の順、平均給与の高い順に並べてください。平均給与は小数を四捨五入して整数にしてください。退職した社員(taishoku_on に日付が入っている社員)と、部署に所属していない社員は集計から除きます。

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

  • SQL Server では使えませんJOIN ... USING (列)・round(x)(引数 1 つ)
  • IBM Db2 では使えませんround(x)(引数 1 つ)

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

  • 模範解答は JOIN ... USING と round(x) を使っています。SQL Server には USING が無いので ON で書き、ROUND は桁数の指定が必須なので round(x, 0) と書きます(Db2 の ROUND も桁数が要ります)。
  • 集約していない列を SELECT に書いたときの扱いは分かれます。エラーにする製品と、そのまま通す製品(MariaDB・SQLite)があります。通る場合もどの行の値が返るかは決まらないので、頼らないでください。
  • 「値が無い」ことの判定は IS NULL です。= NULL と書いても真になりません。
● 起動中…

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

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

解説

結論

GROUP BY で部署ごとにまとめ、avg() で平均、ORDER BY ... DESC で降順にします。在籍条件は WHERE taishoku_on IS NULL です。

なぜ

集約関数は GROUP BY で指定した単位ごとに計算されます。WHERE は集約の「前」に働くので、退職者を除いたうえで平均が求まります。

よくある間違い

①退職者を除き忘れると営業と管理の平均が変わります。②LEFT JOIN にすると部署が NULL の社員が「部署名 NULL」の行として現れます。③社員が 0 人の部署(法務)は内部結合では出てきません。出したい場合は外部結合が必要です。

GROUP BY 句 の使い方をはじめから読む

根拠(一次情報)