応用情報技術者 2011年 春期 午前2 問30
問題文
“社員”表と“人事異動”表から社員ごとの勤務成績の平均を求める適切な SQL文はどれか。ここで、求める項目は、社員コード、社員名、勤務成績(平均)の3項目とする。

選択肢
ア:
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 社員.社員コード、 社員.社員名
社員ごとの勤務成績の平均を求めるSQL文【午前2 解説】
要点まとめ
- 結論:社員コードと社員名でグループ化し、勤務成績の平均を求めるSQL文が正解です。
- 根拠:平均値を求める際は、集計関数AVGを使い、対象の社員ごとにグループ化する必要があります。
- 差がつくポイント:GROUP BY句の指定が正しくないと、正しい平均値が算出できず誤答になります。
正解の理由
選択肢イは、社員テーブルと人事異動テーブルを社員コードで結合し、社員コードと社員名でグループ化しています。これにより、各社員ごとの勤務成績の平均を正しく計算できます。AVG関数を使って勤務成績の平均を求めているため、求める3項目(社員コード、社員名、勤務成績(平均))を正確に取得可能です。
よくある誤解
GROUP BY句に勤務成績を指定すると、勤務成績ごとにグループ化されてしまい、社員ごとの平均が求められません。平均値の計算方法を誤解しやすい点に注意が必要です。
解法ステップ
- 社員テーブルと人事異動テーブルを社員コードで結合する。
- SELECT句で社員コード、社員名、勤務成績の平均を指定する。
- GROUP BY句で社員コードと社員名を指定し、社員ごとに集計する。
- AVG関数を使って勤務成績の平均を計算する。
- SQL文の文法ミスがないか確認する。
選択肢別の誤答解説
- ア:GROUP BY句に勤務成績を指定しているため、勤務成績ごとにグループ化され、社員ごとの平均が求められません。
- イ:正解。社員コードと社員名でグループ化し、AVG関数で平均を正しく計算しています。
- ウ:AVG関数の結果をさらにCOUNTで割っているため、平均値が二重に計算され誤りです。
- エ:MAX関数を使っているため、最大値をカウント数で割る誤った計算となり、平均値は求められません。
補足コラム
SQLで集計を行う際は、GROUP BY句に集計対象のキーを正しく指定することが重要です。AVG関数は指定したカラムの平均値を自動で計算するため、COUNTで割る必要はありません。また、複数テーブルの結合時は結合条件を明確にし、必要なカラムを正しく指定しましょう。
FAQ
Q: なぜGROUP BYに社員コードと社員名の両方が必要ですか?
A: 社員コードは社員を一意に識別しますが、社員名も表示したいため両方をGROUP BYに含めます。
A: 社員コードは社員を一意に識別しますが、社員名も表示したいため両方をGROUP BYに含めます。
Q: AVG関数の代わりにSUMとCOUNTを使うことはできますか?
A: 可能ですが、AVG関数を使う方が簡潔でミスが少ないため推奨されます。
A: 可能ですが、AVG関数を使う方が簡潔でミスが少ないため推奨されます。
関連キーワード: SQL, 集計関数、GROUP BY, AVG, テーブル結合、勤務成績、平均値計算

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

