平成23年度 特別 午前Ⅱ 問6
データ操作
集約関数に関する問題
次の SQL 文によって“会員”表から新たに得られる表はどれか。
〔SQL 文〕
SELECT AVG(年齢) FROM 会員 GROUP BY グループ HAVING COUNT(*) > 1
会員
| 会員番号 | 年齢 | グループ |
|---|---|---|
| 001 | 20 | B |
| 002 | 30 | C |
| 003 | 60 | A |
| 004 | 40 | C |
| 005 | 40 | B |
| 006 | 50 | C |
選択肢は原典では列 AVG(年齢)だけの表。各肢は行の値を上から順に「/」で区切って書いた。
- アAVG(年齢):36
- イAVG(年齢):40
- ウAVG(年齢):30 / 40
- エAVG(年齢):60 / 30 / 40
答えと解説を見る
✓ これが正解ウAVG(年齢):30 / 40
解説
行数が2以上のグループ B と C の平均、30 と 40 が残ります。
GROUP BY グループで行をグループごとにまとめ、HAVING COUNT(*) > 1 で行数が2以上のグループだけを残し、残ったグループごとに AVG(年齢) を求めます。表を分けると、A は会員003の1行で年齢60、B は001と005の2行で年齢20と40、C は002、004、006の3行で年齢30、40、50です。A は行数1なので HAVING で除かれます。B の平均は (20+40)÷2=30、C の平均は (30+40+50)÷3=40 です。結果は30と40の2行になり、正解の表と一致します。WHERE は行に、HAVING はグループに条件を付けるという違いを押さえると、集約関数の問を順に追えます。
ほかの選択肢はなぜ違うのか
- アAVG(年齢):36:36 は、グループ B と C に属する5行の年齢をまとめて (20+40+30+40+50)÷5 とした値です。グループごとの平均を求めていないので、GROUP BY の結果になりません。
- イAVG(年齢):40:40 は、6行すべての年齢の合計240を6で割った表全体の平均と同じ値で、行も1行だけです。グループごとに結果が出るはずなので、2行にならない時点で外れます。
- エAVG(年齢):60 / 30 / 40:60、30、40 はグループ A、B、C それぞれの平均で、HAVING の条件を使わなかった場合の結果です。A は1行しかないので、COUNT(*) > 1 で除かれるはずです。
出典:平成23年度 特別 データベーススペシャリスト試験 午前Ⅱ 問6
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)