ホーム > データベーススペシャリスト試験 > 2015年

データベーススペシャリスト試験 2015年 午前207


過去3年分の記録を保存している“試験結果”表から, 2014年度の平均点数が600点以上となったクラスのクラス名と平均点数の一覧を取得するSQL文はどれか。ここで、実線の下線は主キーを表す。
試験結果(学生番号受験年月日、点数,クラス名)
SELECT クラス名, AVG (点数) FROM 試験結果
    GROUP BY HAVING AVG() >= 600
SELECT クラス名, AVG (点数) FROM 試験結果
    WHERE BETWEEN '2014-04-01' AND '2015-03-31'
    GROUP BY 57 HAVING AVG() >= 600
(正解)
SELECT クラス名, AVG (点数) FROM 試験結果
    WHERE BETWEEN '2014-04-01' AND 2015-03-31'
    GROUP BY クラス名 HAVING 点数 >= 600
SELECT クラス名, AVG(点数) FROM 試験結果
    WHERE 点数 >= 600
    GROUP BY クラス名
    HAVING (MAX(受験年月日) BETWEEN '2014-04-01' AND '2015-03-31')

解説

# 問題解説:2014年度の平均点数が600点以上となったクラス名と平均点数を取得するSQL文

---

## 問題のポイント

- **対象データ**:「試験結果」表
- **条件**:
  - 2014年度の試験結果(2014年4月1日~2015年3月31日の期間)に限定
  - 各クラスの平均点数
  - 平均点数が600点以上のクラスを抽出すること

---

## テーブル構造の確認

| カラム名 | 意味       | 備考                 |
|---------|------------|---------------------|
| 学生番号 | 主キー     | 学生ごとの識別子     |
| 受験年月日 | 試験を受けた日 | 日付で年月日形式     |
| 点数     | 試験の得点 | 数値                 |
| クラス名 | クラス名   | クラスの識別子       |

---

## SQL文に必要な要素

1. **抽出期間の指定**  
   受験年月日が2014年度(2014年4月1日から2015年3月31日)の範囲であるデータに絞るため、`WHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31'` とする。  
   ※日付の指定はWHERE句の中に記述する。

2. **クラスごとにグルーピング**  
   クラス単位で平均点を計算するため、`GROUP BY クラス名`。

3. **平均点数の集計と条件指定**  
   集計関数`AVG(点数)`で平均点を算出し、600点以上のクラスを抽出するために`HAVING AVG(点数) >= 600` という条件を付ける。

---

## 各選択肢の検証

- **ア** 
  ```sql
  SELECT クラス名, AVG(点数) FROM 試験結果
  GROUP BY HAVING AVG() >= 600
  • 文法エラー多数
  • GROUP BYに列指定なし
  • HAVING AVG()は関数の引数が抜けている
  • 不正解
  • SELECT クラス名, AVG(点数) FROM 試験結果
    WHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31'
    GROUP BY クラス名 HAVING AVG(点数) >= 600
    
    • WHERE句で2014年度のデータを正しく絞り込み
    • GROUP BY クラス名によりクラス別に集計
    • HAVING AVG(点数) >= 600で平均点が600点以上をフィルター
    • 正しいSQL文
  • SELECT クラス名, AVG(点数) FROM 試験結果
    WHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31'
    GROUP BY クラス名 HAVING 点数 >= 600
    
    • HAVING句は集計後の条件に使うため、「点数 >= 600」は無意味で誤り
    • 平均点に対する条件ではない
    • 日付の後のシングルクォート位置も誤り('2015-03-31'
    • 不正解
  • SELECT クラス名, AVG(点数) FROM 試験結果
    WHERE 点数 >= 600
    GROUP BY クラス名
    HAVING (MAX(受験年月日) BETWEEN '2014-04-01' AND '2015-03-31')
    
    • WHEREで点数600点以上のみに限定しているが、これは平均点に必要なフィルタではない
    • HAVING句の条件は「最新の試験日が2014年度内かどうか」であるが、対象期間の絞り込みとして不正確
    • 受験日全体から2014年度を抽出すべきで、「MAX(受験年月日)」では部分的な判定しかできない
    • 不正解

まとめ

  • 2014年度の試験データだけ抽出するためにWHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31'が必要
  • クラス名ごとにグルーピングし、クラスごとの平均点を計算
  • HAVING句で平均点数が600点以上のクラスを抽出
  • 正しいSQLは「イ」となります。

正解SQL(イ)

SELECT クラス名, AVG(点数)
FROM 試験結果
WHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31'
GROUP BY クラス名
HAVING AVG(点数) >= 600;

以上の理由より、選択肢イが正解です。
← 前の問題へ次の問題へ →

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