平成27年度 春期 データベーススペシャリスト試験 午前Ⅱ 問7
テクノロジ/データベース過去3年分の記録を保存している“試験結果”表から,2014年度の平均点数が600点以上となったクラスのクラス名と平均点数の一覧を取得するSQL文はどれか。ここで,実線の下線は主キーを表す。 試験結果(学生番号,受験年月日,点数,クラス名)
出典:平成27年度 春期 データベーススペシャリスト試験 午前Ⅱ 問7
- アSELECT クラス名,AVG(点数) FROM 試験結果 GROUP BY クラス名 HAVING AVG(点数) >= 600
- イSELECT クラス名,AVG(点数) FROM 試験結果 WHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31' GROUP BY クラス名 HAVING AVG(点数) >= 600
- ウSELECT クラス名,AVG(点数) FROM 試験結果 WHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31' GROUP BY クラス名 HAVING 点数 >= 600
- エSELECT クラス名,AVG(点数) FROM 試験結果 WHERE 点数 >= 600 GROUP BY クラス名 HAVING (MAX(受験年月日) BETWEEN '2014-04-01' AND '2015-03-31')
正解:イ
解説
2014年度(2014年4月1日~2015年3月31日)のデータだけを対象に平均点数を求める必要があるため,まずWHERE句で受験年月日を2014年度の範囲に絞り込み,その上でクラス名ごとにGROUP BYし,HAVING句でAVG(点数)>=600という条件を課す必要がある。過去3年分のデータが保存されている表であるため,WHERE句で年度を絞り込まずにGROUP BYするだけでは,他の年度のデータも含めた平均になってしまう。
選択肢ごとの解説
- ア誤り。WHERE句で受験年月日を2014年度に絞り込んでいないため,過去3年分全てのデータを含めた平均点数で判定してしまい,2014年度だけの平均点数600点以上という条件を満たさない。
- イ正しい。WHERE句で受験年月日を2014年4月1日から2015年3月31日までに絞り込んだ上で,クラス名ごとにGROUP BYし,HAVING句で平均点数が600点以上であるクラスだけを抽出している。
- ウ誤り。HAVING句の条件が「点数>=600」となっており,個々の点数(グループ化前の非集計列)に対する条件になってしまっている。平均点数(AVG(点数))に対する条件でなければ,設問の意図する「平均点数が600点以上」という判定にならない。
- エ誤り。WHERE句で点数が600点以上の行だけに絞り込んでから平均を求めており,600点未満の点数も含めた本来のクラス平均とは異なる値になってしまう。またHAVING句のMAX(受験年月日)による条件も,2014年度全体を対象とする条件として適切ではない。