年度ごとの平均点を求める SQL 文
出典: 平成31年度 春期 応用情報技術者試験 午前 問28 (IPA)
過去 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')
正解と解説を見る
正解: イ
- ア: 期間を絞っていないので、過去 3 年分の平均になります。
- イ: 2018 年度に絞り込み、クラスごとの平均点数が 600 点以上のクラスを取得しているので、正しい答えです。
- ウ: HAVING 句に集計されていない "点数" を書いており、グループ化した結果に対する条件として誤りです。
- エ: 点数が 600 点以上の行だけを集計してしまい、平均が 600 点以上のクラスにはなりません。
ポイント
- 2018 年度のデータだけを対象にするので、WHERE 句 で受験年月日を '2018-04-01' から '2019-03-31' に絞ります (集計の前に絞り込む)。
- クラスごとの平均なので GROUP BY クラス名。
- 平均点数が 600 点以上のクラスだけにするので、集計結果に対する条件は HAVING AVG(点数) >= 600 です。
WHERE は集計前の行を絞り、HAVING は集計後のグループを絞ります。