令和4年度 秋期 午前 問28
データベース
仕入先コード数
“商品”表に対して,次の SQL 文を実行して得られる仕入先コード数は幾つか。
〔SQL 文〕
SELECT DISTINCT 仕入先コード FROM 商品
WHERE (販売単価 − 仕入単価) >
(SELECT AVG (販売単価 − 仕入単価) FROM 商品)
商品
┌────────────┬────────┬──────────┬────────────────┬──────────┐
│ 商品コード │ 商品名 │ 販売単価 │ 仕入先コード │ 仕入単価 │
├────────────┼────────┼──────────┼────────────────┼──────────┤
│ A001 │ A │ 1,000 │ S1 │ 800 │
│ B002 │ B │ 2,500 │ S2 │ 2,300 │
│ C003 │ C │ 1,500 │ S2 │ 1,400 │
│ D004 │ D │ 2,500 │ S1 │ 1,600 │
│ E005 │ E │ 2,000 │ S1 │ 1,600 │
│ F006 │ F │ 3,000 │ S3 │ 2,800 │
│ G007 │ G │ 2,500 │ S3 │ 2,200 │
│ H008 │ H │ 2,500 │ S4 │ 2,000 │
│ I009 │ I │ 2,500 │ S5 │ 2,000 │
│ J010 │ J │ 1,300 │ S6 │ 1,000 │
└────────────┴────────┴──────────┴────────────────┴──────────┘- ア1
- イ2
- ウ3
- エ4
答えと解説を見る
✓ これが正解ウ3
解説
重複を除いた仕入先コードは三つです。
設問は、示された SQL 文を商品表に対して実行したときに得られる仕入先コード数を問うています。読み解く順は四段です。まず各行について、販売単価から仕入単価を引いた値を出します。次に、副問合せが返す平均を求めます。副問合せには絞り込みの条件が付いていないので、十行すべてが平均の対象です。引いた値の合計は3,600、行数は10なので、平均は360になります。続いて、その値が360を超える行を拾うと、900のD004、400のE005、500のH008、500のI009という四行が残ります。最後に、重複を除く指定が効くので、この四行が持つ仕入先コードから重なりを取り除きます。残るのはS1とS4とS5の三つで、これが正解です。
ほかの選択肢はなぜ違うのか
- ア1:引いた値がいちばん大きい一件だけを見て数えた場合の値です。平均を上回る行は複数あるので、そのすべてについて仕入先コードを集めてから重なりを取り除く必要があります。
- イ2:重なりを取り除いた後の仕入先コードは三種類あるので、そのうち一つを数え落とした場合の値です。平均を上回る行を拾う段で見落としが起きると、この数になります。
- エ4:条件を満たした行の数をそのまま答えた値です。重なりを除く指定が付いているうえ、尋ねられているのも商品の件数ではなく仕入先コードの種類数なので、最後の一段が抜けています。
出典:令和4年度 秋期 応用情報技術者試験 午前 問28
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)