IPA過去問ドリル

平成21年度 春期 データベーススペシャリスト試験 午前Ⅱ 問9

テクノロジ/データベース

“社員”表と“人事異動”表から社員ごとの勤務成績の平均を求める適切なSQL文はどれか。ここで,求める項目は,社員コード,社員名,勤務成績(平均)の3項目とする。 社員 社員コード|社員名|性別|生年月日|入社年月日 O1553|太田 由美|女|1970-03-10|1990-04-01 S3781|佐藤 義男|男|1943-11-20|1975-06-11 O8665|太田 由美|女|1978-10-13|1999-04-01 人事異動 社員コード|配属部門|配属年月日|担当勤務内容|勤務成績 O1553|総務部|1990-04-01|広報(社内報)|69.0 O1553|営業部|1998-07-01|顧客管理|72.0 S3781|資材部|1975-06-11|仕入在庫管理|70.0 S3781|経理部|1984-07-01|資金計画|81.0 S3781|企画部|1993-07-01|会社組織,分掌|95.0 O8665|秘書室|1999-04-01|受付|70.0 (注:本サイトでは原問題の表を文字表記に変換しています)

出典:平成21年度 春期 データベーススペシャリスト試験 午前Ⅱ 問9

正解:イ

解説

社員コード“O1553”と“O8665”はどちらも社員名が“太田 由美”であり,社員名だけでは社員を一意に区別できません。したがって,GROUP BYには社員を一意に識別できる社員コードを含める必要があり,社員コードが決まれば社員名も一意に決まる(関数従属する)ため,社員.社員コード,社員.社員名でグループ化してAVG(勤務成績)を求めるのが正しい方法です。

選択肢ごとの解説

  • 誤り。GROUP BYの対象が勤務成績の値そのものになっており,社員ごとの平均を求めるというグループ化の目的に合っていない。また,SELECT句の社員コード・社員名が集約対象外でグループ化キーにも含まれておらず,SQLとして不適切である。
  • 正しい。社員.社員コードと社員.社員名でグループ化してAVG(勤務成績)を求めており,社員名が重複していても社員コードで正しく区別しながら,社員ごとの勤務成績の平均を求めることができる。
  • 誤り。AVG(勤務成績)/COUNT(勤務成績)は,平均をさらに件数で割ってしまっており,本来求めたい平均(AVGのみ)とは異なる値になる。
  • 誤り。MAX(勤務成績)/COUNT(*)は,最大値を件数で割ったものであり,勤務成績の平均(AVG)を求める式として誤っている。
データベーススペシャリストの過去問を演習モードで解く