ITパスポート 令和3年度 問95:データベースに関する問題
関係データベースで管理された"商品"表,"売上"表から売上日が5月中で,かつ,商品ごとの合計額が20,000円以上になっている商品だけを全て挙げたものはどれか。 商品:商品コード0001=商品A/単価2,000円,0002=商品B/単価4,000円,0003=商品C/単価7,000円,0004=商品D/単価10,000円 売上:Z00001/0004/3個/4/30,Z00002/0001/3個/4/30,Z00005/0003/3個/5/15,Z00006/0001/5個/5/15,Z00003/0002/3個/5/5,Z00004/0001/4個/5/10,Z00007/0002/3個/5/30,Z00008/0003/1個/6/8
- a商品A,商品B,商品C
- b商品A,商品B,商品C,商品D
- c商品B,商品C正答
- d商品C
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは c「商品B,商品C」 です。
まず「5月に売れた分だけ」を選びます。4月や6月のものは仲間外れ。
次に商品ごとに「単価×個数」を足し算して、合計が2万円以上かを見ます。
・商品A(単価2,000円):5月は5個+4個=9個 → 18,000円 → 2万円未満でアウト
・商品B(単価4,000円):3個+3個=6個 → 24,000円 → OK!
・商品C(単価7,000円):5月は3個 → 21,000円 → OK!
・商品D:5月の売上なし → アウト
👉 残るのは B と C。
コツ:①日付でしぼる→②商品ごとに合計→③2万円以上か確認、の3ステップで計算する。
なぜこれが正解か
正解は c。条件は「①売上日が5月」かつ「②商品ごとの合計額が20,000円以上」。5月の売上だけを商品別に集計する。
- 商品A(2,000円):Z00006=5個、Z00004=4個 → 計9個 → 18,000円 →未満で除外
- 商品B(4,000円):Z00003=3個、Z00007=3個 → 計6個 → 24,000円 → 該当
- 商品C(7,000円):Z00005=3個 → 21,000円 → 該当
- 商品D:5月の売上なし(Z00001は4/30)→除外
よって該当は 商品B・商品C。
各選択肢の解説
- a/b:商品A(18,000円)や商品Dを含むため誤り。
- d:商品Bを見落としている。
覚え方・ひっかけ注意
SQLのWHERE(5月でしぼる)→ GROUP BY(商品ごと集計)→ HAVING(合計2万円以上)の順で考える。4/30や6/8を5月に混ぜないのが最大のワナ。「合計に対する条件はWHEREでなくHAVING」も要点。
理論的背景
関係データベース(RDB)のクエリ言語SQLは、集合指向のデータ操作を提供する。本問の計算を正確に行うためのSQLは次の構造になる。
```sql
SELECT 商品.商品名
FROM 売上
JOIN 商品 ON 売上.商品コード = 商品.商品コード
WHERE 売上日 >= '5/1' AND 売上日 <= '5/31'
GROUP BY 商品.商品コード, 商品.商品名, 商品.単価
HAVING SUM(商品.単価 * 売上.個数) >= 20000
```
SQLの論理的処理順序は「FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY」であり、これはSQL文の記述順序とは異なる。WHEREは行レベルの絞り込み(5月の売上行のみを対象にする)、HAVINGはグループ化後の集計値への絞り込み(合計額が2万円以上のグループのみを残す)という役割分担が核心的な概念となる。
5月の売上明細を商品別に集計すると次のようになる(4/30・6/8の行はWHEREで除外)。
- 商品A(単価2,000円):Z00006(5月15日・5個)+Z00004(5月10日・4個)=9個 → 18,000円 → 20,000円未満で除外
- 商品B(単価4,000円):Z00003(5月5日・3個)+Z00007(5月30日・3個)=6個 → 24,000円 → 条件クリア
- 商品C(単価7,000円):Z00005(5月15日・3個)=3個 → 21,000円 → 条件クリア
- 商品D:Z00001は4月30日売上のため期間外、5月の売上なし → 除外
実務での使われ方
GROUP BY + HAVINGの組み合わせはビジネスインテリジェンスの定番クエリパターンである。月次・四半期の売上集計で「売上高が100万円以上の営業担当者だけを抽出」「注文件数が10件以上の顧客を優良顧客としてフラグを立てる」などの集計条件付き抽出が日常的に行われる。
ECサイトのRFM分析では、`GROUP BY 顧客ID HAVING MAX(注文日)` で最終購買日(Recency)、`COUNT(*)` で購買頻度(Frequency)、`SUM(購買金額)` で累計購買額(Monetary)を算出し、優良顧客セグメントの抽出に活用する。BIツール(TableauやPowerBIなど)も内部ではこうしたSQLを自動生成しており、集計ロジックの理解は不可欠である。
日付の範囲指定ではBETWEEN演算子(`BETWEEN '2024-05-01' AND '2024-05-31'`)や月を抽出する`MONTH()`関数が使われることも多い。本問のように手計算で解く際は「月をまたぐ日付(4/30、6/8)を機械的に除外する」という思考の切り替えが最重要である。
試験での位置づけ
ITパスポートのデータベース分野で、表の結合と集計を組み合わせた計算問題は最高難度の設問として出題される。得点差がつきやすく、「WHERE と HAVING の違い」「日付境界の取り扱い」「JOIN の意味理解」の3点が得点の分かれ目になる。
上位資格の基本情報技術者(FE)では同類問題がSQL文の穴埋め形式で出題され、`HAVING SUM(単価*個数) >= 20000` のような集約関数の記述を直接問われる。データベーススペシャリスト(DB)ではさらに、サブクエリ・ウィンドウ関数・インデックス設計・実行計画の最適化まで踏み込んだ問題が出題される。
選択肢の発展補足
選択肢a(商品A・B・C):商品Aを含めた誤答。商品Aの5月売上は9個×2,000円=18,000円で条件の20,000円未満。4/30のZ00002(商品A・3個)を誤って5月に含めると18,000+6,000=24,000円となりAが残るワナ。日付境界の見落としは本問で最もよく発生するミス。
選択肢b(商品A・B・C・D):商品AとDを誤って含めた場合の答え。商品DのZ00001は4月30日売上であり、5月売上はゼロ。D自体の集計行がSQLのJOINで生成される(商品マスタとの外部結合を用いた場合)かどうかの理解とも関連する。内部結合(INNER JOIN)であれば売上行がない商品Dは結果セットに現れない。
選択肢d(商品Cのみ):商品Bを見落とした場合の誤答。商品Bは6,000円×2回=24,000円で条件を明確にクリアする。選択肢dを選ぶミスは多くの場合、Z00003(5月5日・商品B)かZ00007(5月30日・商品B)のどちらかを見落としている。複数の売上記録を商品ごとに全て集約してから条件判定することが関係データベース操作の本質であり、本問の学習ポイントである。
出典:IPA(情報処理推進機構)公式 ITパスポート試験 令和3年度 問95/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。