令和元年度春期 応用情報技術者試験 午前 問28
過去3年分の記録を保存している"試験結果"表から,2018年度の平均点数が600点以上となったクラスのクラス名と平均点数の一覧を取得するSQL文はどれか。ここで,実線の下線は主キーを表す。試験結果(学生番号,受験年月日,点数,クラス名)
- ア SELECT クラス名, AVG(点数) FROM 試験結果 GROUP BY クラス名 HAVING AVG(点数) >= 600
- イ SELECT クラス名, AVG(点数) FROM 試験結果 WHERE 受験年月日 BETWEEN '2018-04-01' AND '2019-03-31' GROUP BY クラス名 HAVING AVG(点数) >= 600
- ウ SELECT クラス名, AVG(点数) FROM 試験結果 WHERE 受験年月日 BETWEEN '2018-04-01' AND '2019-03-31' GROUP BY クラス名 HAVING 点数 >= 600
- エ SELECT クラス名, AVG(点数) FROM 試験結果 WHERE 点数 >= 600 GROUP BY クラス名 HAVING (MAX(受験年月日) BETWEEN '2018-04-01' AND '2019-03-31')
解答・解説を見る
正解:イ
AI解説
要件は「2018年度のデータに限定」「クラスごとに平均」「平均600点以上に絞る」の三つである。行の絞り込み(2018年度=2018-04-01〜2019-03-31)はWHERE句、クラスごとの集計はGROUP BY句、集計結果(AVG)による絞り込みはHAVING句で行う。この役割分担を全て満たすのはイである。 ア: 誤り。WHERE句がなく3年分全ての記録が集計対象になるため、2018年度の平均にならない。 イ: 正しい。WHEREで2018年度の行に限定し、GROUP BYでクラス別に集計し、HAVING AVG(点数)>=600で平均600点以上のクラスに絞っている。 ウ: 誤り。HAVING句にグループ化していない列「点数」を単独で指定しており、文法的に不適切である(集計関数を使う必要がある)。 エ: 誤り。WHERE 点数>=600で600点以上の行だけを先に抽出してしまうため、平均点が実際より高く計算され、要件と異なる結果になる。 💡 「WHEREは集計前の行の条件、HAVINGは集計後のグループの条件」が鉄則。WHEREで点数を絞ってから平均を取る肢は定番のひっかけである。
※Web掲載用に表記を一部変更しています。著作権はIPAに帰属します。