HAVING句と集計関数を用いた年度別平均点抽出SQL

正解は「イ」です。 SQL 文の構成要素と処理順序を検証します。 1. 対象期間の絞り込み(WHERE 句): 2018 年度の記録(2018年4月1日〜2019年3月31日)を抽出するため、 WHERE 受験年月日 BETWEEN '2018-04-01' AND '2019-03-31' で絞り込みます。 2. グループ化(GROUP BY 句): クラスごとの平均点を求めるため、 GROUP BY クラス名 を指定します。 3. 集計結果の条件指定(HAVING 句): 平均点数が 600 点以上のクラスに絞り込むため、 HAVING AVG(点数) >= 600 を指定します。 ※集計関数( AVG )の結果に対する条件指定は WHERE 句ではなく HAVING 句で行う必要があります。 これらをすべて満たす SQL 文は「イ」です。 WHERE 句で受験年月日を絞っていないので、過去3年分すべての記録でクラスごとの平均点を求めてしまいます。 HAVING 句にはグループ単位で決まる値(集計関数や GROUP BY の列)しか書けません。個々の行の「点数」を条件にした HAVING 点数 >= 600 は、平均点の条件になりません。 WHERE 点数 >= 600 で600点未満の記録を先に除いてから平均するため、正しい平均点になりません。また MAX(受験年月日) の条件はクラスの最新の受験日を見るだけで、2018年度の記録に絞った集計にはなりません。 選択肢 2018年度に絞るか(WHERE) 平均600点以上の条件 判定 ア 絞らない(3年分を集計) HAVING AVG(点数) >= 600 × イ BETWEEN で絞る HAVING AVG(点数) >= 600 ○ ウ BETWEEN で絞る HAVING 点数 >= 600(集計前の列) × エ WHERE 点数 >= 600 で先に除外 期間の条件が不適切 ×

過去 3 年分の記録を保存している“試験結果”表から,2018 年度の平均点数が 600 点以上となったクラスのクラス名と平均点数の一覧を取得する SQL 文はどれか。ここで,実線の下線は主キーを表す。

試験結果(学生番号,受験年月日,点数,クラス名)

出典平成31年 春期 応用情報技術者試験 午前 問28
ア
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')