平成23年度 特別 午前 問30
データベース
SQL文
“社員”表と“人事異動”表から社員ごとの勤務成績の平均を求める適切な 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 |
- アSELECT 社員.社員コード,社員名,AVG(勤務成績) AS "勤務成績(平均)" FROM 社員,人事異動 WHERE 社員.社員コード = 人事異動.社員コード GROUP BY 勤務成績
- イSELECT 社員.社員コード,社員名,AVG(勤務成績) AS "勤務成績(平均)" FROM 社員,人事異動 WHERE 社員.社員コード = 人事異動.社員コード GROUP BY 社員.社員コード,社員.社員名
- ウSELECT 社員.社員コード,社員名,AVG(勤務成績)/COUNT(勤務成績) AS "勤務成績(平均)" FROM 社員,人事異動 WHERE 社員.社員コード = 人事異動.社員コード GROUP BY 社員.社員コード,社員.社員名
- エSELECT 社員.社員コード,社員名,MAX(勤務成績)/COUNT(*) AS "勤務成績(平均)" FROM 社員,人事異動 WHERE 社員.社員コード = 人事異動.社員コード GROUP BY 社員.社員コード,社員.社員名
答えと解説を見る
✓ これが正解イSELECT 社員.社員コード,社員名,AVG(勤務成績) AS "勤務成績(平均)" FROM 社員,人事異動 WHERE 社員.社員コード = 人事異動.社員コード GROUP BY 社員.社員コード,社員.社員名
解説
社員ごとにまとめ、AVG で平均を出す文です。
四つの文は、取り出す表と結合の条件がすべて同じですから、違いは二か所しかありません。何を単位にまとめるかと、平均をどう求めるかです。まず単位を見ます。求められているのは社員ごとの平均ですから、まとめる単位は社員を見分ける列でなければなりません。集めたい相手そのものではなく、集められる値の側でまとめてしまうと、欲しい区切りが得られませんし、取り出そうとしている列が組の中で一つに定まらなくなります。取り出す列は、原則としてまとめる単位にも並べます。次に求め方です。AVG のような集合関数は、与えられた列の値をまとめて一つの値にします。AVG はそれだけで平均を返しますので、ほかの演算を重ねると別の量に変わってしまいます。数字で確かめておきます。三回の異動がある社員の勤務成績は 70.0 と 81.0 と 95.0 ですから、合計 246.0 を 3 で割った 82.0 が求める平均であり、AVG だけを使った文はこの値を返します。集約の式を検算するときは、行が二件以上ある社員で当ててください。行が一件しかない社員では、誤った式でも同じ値が出てしまい、違いが表に現れません。なお、この表には同じ氏名で生年月日の違う社員が二人います。氏名だけでまとめると別人が一つの組に入りますが、社員コードでまとめれば分かれます。
ほかの選択肢はなぜ違うのか
- アSELECT 社員.社員コード,社員名,…:まとめる単位に勤務成績を指定しています。同じ点数の行どうしが一つの組になるだけで、社員の区切りになりません。組の中で社員コードも社員名も一つに定まらず、取り出す列として並べることもできません。
- ウSELECT 社員.社員コード,社員名,…:平均を表す値を、さらに件数で割る形になっています。三件の異動がある社員に当てると 82.0 を 3 で割った 27.3 ほどとなり、真の値から大きく下に外れます。割る操作が二重になっているためです。
- エSELECT 社員.社員コード,社員名,…:最大値を行数で割る形です。三件の異動がある社員なら 95.0 を 3 で割った 31.7 ほどとなり、平均とは別の量になります。まとめる単位は正しくても、求め方が平均になっていません。
この問題の用語
- 部門組織の中で、仕事の種類や担当ごとに分けられたまとまりです。専門ごとに分ける分け方と、製品や地域ごとに分ける分け方があります。
- 企画何のために作るのかを決め、進める形をまとめる最初の段階です。ここで業務の進め方そのものを見直すと、大きな改善につながります。
- 組織目的を果たすために、人が役割を分けて集まったまとまりのことです。分け方には機能別、事業部制、マトリックスなどの形があります。
出典:平成23年度 特別 応用情報技術者試験 午前 問30
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)