応用情報技術者 2022年 秋期 午前2 問28
問題文
“商品”表に対して、次の SQL文を実行して得られる仕入先コード数は幾つか。
〔SQL文〕
SELECT DISTINCT 仕入先コード FROM 商品
WHERE(販売単価 - 仕入単価) >
(SELECT AVG (販売単価 - 仕入単価) FROM 商品)

選択肢
ア:1
イ:2
ウ:3(正解)
エ:4
🔒 解説は解答すると表示されます
平均超過商品の仕入先数【午前2解説】
正解の理由
まず各行について「販売単価 − 仕入単価」を計算すると、合計は 、件数は 件なので平均は (円)です。平均 を厳密に上回る差がある商品は次の4件です。
- 4行目:(仕入先コード S1)
- 5行目:(仕入先コード S1)
- 8行目:(仕入先コード S4)
- 9行目:(仕入先コード S5)
このうち仕入先コードを重複なく数えると S1, S4, S5 の 3 つになります(DISTINCT による重複排除)。したがって選択肢のうちウが正しい答えです。
解法ステップ
- 各行で差分 = 販売単価 − 仕入単価 を求める。
(結果:200, 200, 100, 900, 400, 200, 300, 500, 500, 300) - 差分の合計を求める:。件数 で平均は 。
(式:) - 各行の差分が平均より大きいかを比較し、該当行を抽出する。該当は 4 行(4,5,8,9)。
- 抽出された行の仕入先コードに DISTINCT を適用して重複を除き、個数を数える → 3。
選択肢別の誤答解説
- ア(1)
抽出された商品のうち仕入先コードが1種類だけだと誤認したケース。実際は S1 が重複しているため 1 にはならない。 - イ(2)
重複除去を誤って行うか、該当商品の数(4)と DISTINCT 後の個数を混同して、2 と誤答することがある。実際の DISTINCT 後は 3。 - ウ(3)
正答。上で示したように該当商品の仕入先は S1, S4, S5 の 3 種類である。 - エ(4)
「平均を超える商品の件数」をそのまま答えとして使った誤り。クエリは DISTINCT で仕入先コードを返すため、重複を除いた個数を数う必要があり、4 ではない。
よくある誤解
- 「平均と等しいものも含める」
問は厳密な不等号>を使っているため、平均と等しい行(差分が のもの)があっても含めない点に注意。 - 「商品数と仕入先数の混同」
サブクエリで商品を絞った後、そのまま商品件数を答えるミスが多い。DISTINCT があるため「仕入先コードのユニーク数」を数える必要がある。 - 「AVG の計算方法の誤認」
AVG(販売単価 − 仕入単価) は AVG(販売単価) − AVG(仕入単価) と等しいが、丸めや NULL の扱いに注意する(本問では整数で問題なし)。
補足コラム
同じ結果を得る別の書き方として、件数を直接取得するには次のように書けます(説明用、実行は不要):
SELECT COUNT(DISTINCT 仕入先コード) FROM 商品 WHERE (販売単価 - 仕入単価) > (SELECT AVG(販売単価 - 仕入単価) FROM 商品)
この形にすると「何件か」という問いに対して直接数値を返すため、問題演習では答え合わせがしやすくなります。
FAQ
Q. 平均が小数になったらどう扱う?
A. SQL の AVG は通常小数で返るため、比較は小数で行われます。今回のように平均が整数でも、条件は正しく評価されます。
A. SQL の AVG は通常小数で返るため、比較は小数で行われます。今回のように平均が整数でも、条件は正しく評価されます。
Q. AVG の代わりに別の集計を書くときの注意点は?
A. AVG(販売単価) − AVG(仕入単価) は理論上同値ですが、NULL の有無や型変換で挙動が変わる場合があるので注意してください。
A. AVG(販売単価) − AVG(仕入単価) は理論上同値ですが、NULL の有無や型変換で挙動が変わる場合があるので注意してください。
関連キーワード: SQL、DISTINCT、AVG、サブクエリ、WHERE、集約関数、重複排除、比較演算子、SELECT COUNT

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

