ホーム > データベーススペシャリスト試験 > 2009年
データベーススペシャリスト試験 2009年 午前2 問09
“社員”表と“人事異動”表から社員ごとの勤務成績の平均を求める適切な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()
を組み合わせる必要はありません。
解法ステップ
- 「社員」表と「人事異動」表を社員コードで結合する。
- 社員ごとに勤務成績の平均を求めるため、社員コードと社員名でグループ化する。
AVG()
関数を使って勤務成績の平均を計算する。- SELECT句で社員コード、社員名、勤務成績の平均を指定する。
選択肢別の誤答解説
- ア:
GROUP BY 勤務成績
としており、勤務成績ごとにグループ化してしまうため、社員ごとの平均が求められません。 - イ:正解。社員コードと社員名でグループ化し、
AVG(勤務成績)
で平均を正しく計算しています。 - ウ:
AVG(勤務成績)/COUNT(勤務成績)
と誤った計算をしており、AVG()
関数だけで平均は求められます。 - エ:
MAX(勤務成績)/COUNT(*)
と平均ではなく最大値を使っており、正しい平均値が求められません。
補足コラム
SQLの集計関数には
平均値は
結合時は
SUM()
, COUNT()
, AVG()
, MAX()
, MIN()
があります。平均値は
AVG()
で簡単に求められ、GROUP BY
句で集計単位を指定します。結合時は
JOIN
句を使うのが一般的ですが、問題文のようにカンマ区切りの結合も可能です。FAQ
Q:
A: 集計単位を複数の列で指定することで、より細かい単位で集計結果を得られます。
GROUP BY
句に複数の列を指定する理由は?A: 集計単位を複数の列で指定することで、より細かい単位で集計結果を得られます。
Q:
A: 対象列の値の合計を件数で割った値を返します。自分で計算する必要はありません。
AVG()
関数はどのように計算される?A: 対象列の値の合計を件数で割った値を返します。自分で計算する必要はありません。
関連キーワード: SQL, 集計関数, GROUP BY, 平均値, テーブル結合, SELECT文