データベーススペシャリスト試験 2009年 午前209


“社員”表と“人事異動”表から社員ごとの勤務成績の平均を求める適切な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(勤務成績)で勤務成績の平均を正しく計算しています。
また、WHERE句で社員コードを結合条件に指定し、社員ごとの勤務成績を正しく紐付けています。
これにより、社員ごとの勤務成績の平均値を正確に取得できるため正解です。

よくある誤解

  • GROUP BYに集計対象の列を指定すると、平均値が正しく計算されません。
  • 平均値を自分で計算しようとしてAVG()COUNT()を組み合わせる必要はありません。

解法ステップ

  1. 「社員」表と「人事異動」表を社員コードで結合する。
  2. 社員ごとに勤務成績の平均を求めるため、社員コードと社員名でグループ化する。
  3. AVG()関数を使って勤務成績の平均を計算する。
  4. SELECT句で社員コード、社員名、勤務成績の平均を指定する。

選択肢別の誤答解説

  • ア:GROUP BY 勤務成績としており、勤務成績ごとにグループ化してしまうため、社員ごとの平均が求められません。
  • :正解。社員コードと社員名でグループ化し、AVG(勤務成績)で平均を正しく計算しています。
  • ウ:AVG(勤務成績)/COUNT(勤務成績)と誤った計算をしており、AVG()関数だけで平均は求められます。
  • エ:MAX(勤務成績)/COUNT(*)と平均ではなく最大値を使っており、正しい平均値が求められません。

補足コラム

SQLの集計関数にはSUM(), COUNT(), AVG(), MAX(), MIN()があります。
平均値はAVG()で簡単に求められ、GROUP BY句で集計単位を指定します。
結合時はJOIN句を使うのが一般的ですが、問題文のようにカンマ区切りの結合も可能です。

FAQ

Q: GROUP BY句に複数の列を指定する理由は?
A: 集計単位を複数の列で指定することで、より細かい単位で集計結果を得られます。
Q: AVG()関数はどのように計算される?
A: 対象列の値の合計を件数で割った値を返します。自分で計算する必要はありません。

関連キーワード: SQL, 集計関数, GROUP BY, 平均値, テーブル結合, SELECT文
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ