平成23年度 特別試験 応用情報技術者試験 午前 問30
“社員”表と“人事異動”表から社員ごとの勤務成績の平均を求める適切な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 社員.社員コード, 社員.社員名
キーボード:1〜4 で解答 → 次の問題 ← 前の問題
正解と解説を見る
解答する前に解説を開いたので、この問題は「見て解いた」として記録します(正解数には入りません)。
正解:イ
社員ごとの平均を求めるので,2つの表を社員コードで結合した後,社員ごと(社員コード,社員名)にグループ化して AVG(勤務成績) を求めます。SELECT句に社員コードと社員名を書くため,GROUP BY句にもこの2つを指定する必要があります。
なお,“太田 由美”は2人いる(同姓同名)ので,社員名だけでグループ化すると別人の成績がまとめられてしまいます。社員コードでグループ化することが重要です。
-
ア: GROUP BY 勤務成績
誤り。勤務成績の値ごとにグループ化してしまうため,社員ごとの平均になりません。また,SELECT句の社員コードや社員名がGROUP BY句にないため,SQLとしても誤りです。 -
イ: GROUP BY 社員.社員コード, 社員.社員名 で AVG(勤務成績)
正しい。社員ごとにグループ化し,AVGで勤務成績の平均を求めているので適切です。例えばO1553は (69.0+72.0)÷2=70.5 になります。 -
ウ: AVG(勤務成績)/COUNT(勤務成績)
誤り。AVGは既に平均値なので,さらに件数で割ると平均にはなりません。 -
エ: MAX(勤務成績)/COUNT(*)
誤り。最大値を件数で割っても平均にはなりません。平均は合計を件数で割った値(SUM/COUNT 又は AVG)です。
答え
イ: GROUP BY 社員.社員コード, 社員.社員名 で AVG(勤務成績)
出典:平成23年度 特別試験 応用情報技術者試験 午前 問30