過去問解きまくり研究所 ホーム

平成23年度 特別 午前 問30

データベース

SQL文

“社員”表と“人事異動”表から社員ごとの勤務成績の平均を求める適切な SQL 文はどれか。ここで,求める項目は,社員コード,社員名,勤務成績(平均)の 3 項目とする。

社員
社員コード社員名性別生年月日入社年月日
O1553太田 由美女1970-03-101990-04-01
S3781佐藤 義男男1943-11-201975-06-11
O8665太田 由美女1978-10-131999-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
答えと解説を見る

✓ これが正解イSELECT 社員.社員コード,社員名,AVG(勤務成績) AS "勤務成績(平均)" FROM 社員,人事異動 WHERE 社員.社員コード = 人事異動.社員コード GROUP BY 社員.社員コード,社員.社員名

解説

社員ごとにまとめ、AVG で平均を出す文です。

四つの文は、取り出す表と結合の条件がすべて同じですから、違いは二か所しかありません。何を単位にまとめるかと、平均をどう求めるかです。まず単位を見ます。求められているのは社員ごとの平均ですから、まとめる単位は社員を見分ける列でなければなりません。集めたい相手そのものではなく、集められる値の側でまとめてしまうと、欲しい区切りが得られませんし、取り出そうとしている列が組の中で一つに定まらなくなります。取り出す列は、原則としてまとめる単位にも並べます。次に求め方です。AVG のような集合関数は、与えられた列の値をまとめて一つの値にします。AVG はそれだけで平均を返しますので、ほかの演算を重ねると別の量に変わってしまいます。数字で確かめておきます。三回の異動がある社員の勤務成績は 70.0 と 81.0 と 95.0 ですから、合計 246.0 を 3 で割った 82.0 が求める平均であり、AVG だけを使った文はこの値を返します。集約の式を検算するときは、行が二件以上ある社員で当ててください。行が一件しかない社員では、誤った式でも同じ値が出てしまい、違いが表に現れません。なお、この表には同じ氏名で生年月日の違う社員が二人います。氏名だけでまとめると別人が一つの組に入りますが、社員コードでまとめれば分かれます。

ほかの選択肢はなぜ違うのか

この問題の用語

出典:平成23年度 特別 応用情報技術者試験 午前 問30

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)