令和6年度 秋期 午前Ⅱ 問7
データ操作
NULLに関する問題
“商品”表と“商品別売上実績”表に対して,SQL文を実行して得られる売上平均金額はどれか。
商品
| 商品コード | 商品名 | 商品ランク |
|---|---|---|
| S001 | PPP | A |
| S002 | QQQ | A |
| S003 | RRR | A |
| S004 | SSS | B |
| S005 | TTT | C |
| S006 | UUU | C |
商品別売上実績
| 商品コード | 売上合計金額 |
|---|---|
| S001 | 50 |
| S003 | 250 |
| S004 | 350 |
| S006 | 450 |
〔SQL文〕
SELECT AVG(売上合計金額) AS 売上平均金額
FROM 商品 LEFT OUTER JOIN 商品別売上実績
ON 商品.商品コード = 商品別売上実績.商品コード
WHERE 商品ランク = 'A'- ア100
- イ150
- ウ225
- エ275
答えと解説を見る
✓ これが正解イ150
解説
ランクAの3行のうち NULL を除いた2行の平均で、150です。
商品表を左側に置いた LEFT OUTER JOIN なので、商品表の行はすべて残り、売上実績のない商品は売上合計金額が NULL になります。WHERE で商品ランクAに絞ると、S001 が50、S002 が NULL、S003 が250の3行です。AVG は NULL の行を計算から除くので、合計は50+250=300、件数は2で、平均は300÷2=150 です。見分ける軸は、外部結合で生まれた NULL を集約関数がどう扱うかです。AVG、SUM、MAX などの集約関数は NULL を無視しますが、件数の数え方まで変わる点に注意しましょう。NULL を0として3で割ると値が変わるので、どちらで割るかを確かめる習慣をつけると取り違えません。
ほかの選択肢はなぜ違うのか
- ア100:100は、S002 の NULL を0とみなし、合計300を3件で割った値です。AVG は NULL の行を計算に含めないので、3件ではなく2件で割るのが正しく、100にはなりません。
- ウ225:225は、ランクAの3行からは NULL をどう扱っても得られません(除けば150、0とみなせば100)。条件をランクCと取り違え、NULL を0として (0+450)÷2 とすると225になりますが、この SQL 文の結果ではありません。
- エ275:275は、商品ランクの条件を外して売上実績の4行すべて(50、250、350、450)を平均した値です。合計1100を4で割ると275になりますが、WHERE 句でランクAに絞っているので、この値にはなりません。
出典:令和6年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問7
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)