戦国IT - 情報処理技術者試験の過去問対策サイト
お知らせお問い合わせ料金プラン

応用情報技術者 2018年 春期 午後06


備品購買システムの設計と実装に関する次の記述を読んで、設問1〜4に答えよ。

 R社は、ソフトウェアパッケージの開発及び販売を行う中堅企業である。これまで備品の購買は、総務部が表計算ソフトを用いて管理し、行っていた。このため、見積依頼や発注、納品された備品の確認などを円滑に行うために、備品購買システムを構築することになった。  備品購買の処理の流れとシステム化対象を表1に示す。
応用情報技術者試験(平成30年度 午後 問06 表01)
 この処理の流れから検討した、備品購買システムのデータベースのE-R図を図1に示す。  このデータベースでは、E-R図のエンティティ名を表名にし、属性名を列名にして、適切なデータ型で表定義した関係データベースによって、データを管理する。
応用情報技術者試験(平成30年度 午後 問06 図01)
〔相見積り機能の検討〕  備品購買システムに相見積り機能を追加することを検討する。相見積り機能とは、複数の取引先へ同じ内容の見積依頼を出す機能である。これによって、より安い価格を提示した取引先へ発注を行うことができるようになる。見積依頼を一度に複数の取引先へ出すために、見積依頼エンティティを二つのエンティティに分けることを考える。  一つ目のエンティティは、複数の取引先への見積依頼を束ねるエンティティとして、キーに見積依頼番号、属性に見積依頼日と見積依頼者、a をもたせる。  二つ目のエンティティは、各取引先への見積依頼を管理するエンティティとして、キーに de、属性に取引先担当者をもたせる。  この変更に伴い、f エンティティにも変更を加えることで、この機能を実装することができた。   〔検収機能の作成〕  検収のために、発注した各商品の数量と納品された数量を、商品番号の昇順に一覧表示するSQL文を図2に示す。ここで、“:発注番号”は、指定された発注番号を格納する埋込み変数である。  なお、関数COALESCE(A, B)は、AがNULLでないときはAを、AがNULLのときはBを返す。
応用情報技術者試験(平成30年度 午後 問06 図02)
〔返品対応〕  備品購買システムが完成し、運用が開始されてから数か月後、総務部から問合せがあった。取引先から納品された商品を登録した後、利用部門から商品の一部に問題があったので返品したが、その際の情報を記録したい、とのことであった。  納品登録したレコード中の納品数量から返品した数量を減らす方法をまず考えたが、その方法では、納品された商品数量や返品したという事実を記録することができない。そこで、データベースの定義や納品登録した際のレコードには変更を加えずに、①納品表と納品明細表とそれぞれ新しいレコードを追加することで、返品に関する情報を記録することができた。

設問1

図1及び本文中のa、図1中のbcに入れる適切なエンティティ間の関連及び属性名を答え、E-R図を完成させよ。  なお、エンティティ間の関連及び属性名の表記は、図1の凡例に従うこと。

模範解答

a:希望回答日 b:— c:→

解説

解答の論理構成

  • 【問題文】では見積依頼処理について
    「数量及び希望回答日と一緒に入力する。」と明示しています。
    また、相見積り用に新設する一つ目のエンティティには
    「キーに見積依頼番号、属性に見積依頼日と見積依頼者、a をもたせる。」
    と指示されています。
    したがって、a に入る属性名は “希望回答日” となります。
  • 図1の凡例では、エンティティ間の関連を線種で区別しています。
    1対1 … 実線(—)
    1対多 … 実線+矢印(→)
    (多対多は本問に該当なし)
  • 【問題文】に記された既存の関連は次のとおりです。
    ・「発注 → 検収(1対1)」
    ・「発注 → 納品(1対多)」
    したがって
    b は 1対1 を示す “—”
    c は 1対多 を示す “→”
    が正解となります。
  • 以上より解答は
    a:希望回答日
    b:—
    c:→

誤りやすいポイント

  • 1対1 と 1対多 の線種記号を逆に書く
    (“→” を 1対1 と思い込みやすい)。
  • “希望納品日” と取り違える
    「見積依頼」で入力するのは “希望回答日”、
    「発注」で入力するのは “希望納品日” です。
  • 図1の凡例を見落とし、線種を文章で書いてしまう
    (「1対1」と記述するだけでは減点対象)。

FAQ

Q: “—” と “→” の向きは答案に影響しますか?
A: はい。図中の向きは「1側→多側」を示しているため、向きを誤ると別の関連と判定されます。
Q: “希望回答日” を時刻型にしても良いですか?
A: 日付のみで十分という業務要件が多いですが、回答時刻まで管理する運用なら日時型でも設計上問題ありません。
Q: 1対1 の関連をあえて分割したままにする利点は?
A: 当事者を明確化できる、履歴管理しやすいなどの理由で別エンティティにすることがあります。

関連キーワード: ER図, 1対多, 外部キー, データモデリング, 相見積り

設問2

本文中のdfに入れる適切な字句を答えよ(dとeは順不同)。

模範解答

d:見積依頼番号 e:取引先番号 f:見積依頼明細

解説

解答の論理構成

  1. 相見積りを実現するには、同一の依頼内容を複数の取引先へ送れるように“束ね役”と“取引先別”の二段構えが必要です。本文には
    「一つ目のエンティティは、複数の取引先への見積依頼を束ねるエンティティとして、キーに見積依頼番号、属性に見積依頼日と見積依頼者、a をもたせる。」
    とあり、ここでキーに既に「見積依頼番号」が指定されています。
  2. 二つ目のエンティティについては
    「二つ目のエンティティは、各取引先への見積依頼を管理するエンティティとして、キーに de、属性に取引先担当者をもたせる。」
    と記述されています。複数取引先へ依頼を出す以上、キーは「見積依頼番号」に対し「取引先番号」を組み合わせた複合主キーにするのが自然です。
  3. さらに
    「この変更に伴い、f エンティティにも変更を加えることで、この機能を実装することができた。」
    とあるため、見積依頼にぶら下がる明細エンティティを、取引先別見積依頼へぶら下がる形に修正する必要があります。E-R図には“見積依頼明細”が存在し、従来は親キー「見積依頼番号」のみを外部キーにしていました。相見積り導入後は親が“見積依頼番号+取引先番号”の複合キーになるため、最も影響を受けるエンティティは“見積依頼明細”です。
  4. 以上より
    d=「見積依頼番号」
    e=「取引先番号」
    f=「見積依頼明細」
    が妥当であると結論づけられます。

誤りやすいポイント

  • 「見積番号」と勘違いしやすい
    見積は“取引先が回答した後”に発生するエンティティであり、依頼フェーズのキーにはなりません。
  • 「見積依頼番号+見積依頼明細番号」と取り違える
    明細側は取引先を区別せずに商品単位で採番していたため、複合主キーの構成を取り違えがちです。
  • f に「見積」や「発注」を選ぶミス
    相見積りで直接変更が必要なのは、見積依頼に従属する“明細”であり、見積や発注の構造には直接影響しない点を見落としがちです。

FAQ

Q: 取引先別見積依頼を新エンティティにするメリットは何ですか?
A: 「見積依頼番号」と「取引先番号」で複合主キーにすることで、同一依頼内容を複数取引先へ送るレコードを一意に識別できます。価格比較や発注先選定がSQL一発で可能になる点も利点です。
Q: f が「見積依頼明細」である根拠をもう少し教えてください。
A: “商品番号・数量”などの明細は本来依頼単位で管理されます。親側のキーが複合化すれば、子側の外部キーも同じ複合キーを参照できるよう定義変更が必要です。E-R図で見積依頼に 1 対多で接続されている唯一の明細エンティティが「見積依頼明細」なので、ここが該当します。
Q: 相見積り導入で他に注意すべき制約はありますか?
A: 「見積依頼番号+取引先番号」の複合キーを外部参照するテーブルが増えるため、カスケード更新/削除の設定やインデックスの張り方を見直す必要があります。

関連キーワード: 複合主キー, E-R図, 外部キー, 相見積り, 1対多

設問3

図2中のgjに入れる適切な字句又は式を答えよ。  なお、表の列名には必ずその表の別名を付けて答えよ。

模範解答

g:DLI.納品数量計 h:OD.発注番号 = :発注番号 i:GROUP BY DE.発注番号, DD.商品番号 j:ORDER BY ORD.商品番号

解説

解答の論理構成

  1. 集計済みの納品数量を取得する
    • 【問題文】には
      “COALESCE(           g, 0)”
      とあり、NULL のときだけ 0 を返すように指示しています。
    • LEFT OUTER JOIN で結合する内側サブクエリでは、SUM(DD.納品数量) AS 納品数量計 を出力しているので、空欄 g にはその列を参照する DLI.納品数量計 が入ります。
  2. 発注側サブクエリの抽出条件
    • 発注明細を絞り込む条件として
      “WHERE              h
      が要求されています。
    • 指定された発注番号を表す埋込み変数“:発注番号”が与えられているため、発注 表(別名 OD)の主キー列を比較する式
      OD.発注番号 = :発注番号
      h となります。
  3. 納品側サブクエリでの集計単位
    • 納品数量を商品ごとに合計するため
      “WHERE DE.発注番号 = :発注番号
                    i
      が示されています。
    • SUM を使用しているので GROUP BY が必須です。発注番号と商品番号の組で集計するため
      GROUP BY DE.発注番号, DD.商品番号
      i に入ります。
  4. 最終結果の並べ替え
    •                j” は一覧の表示順を指示する位置です。
    • 要件に “発注した各商品の数量と納品された数量を、商品番号の昇順に一覧表示” とあるので、ORDER BY ORD.商品番号 が j になります。
以上より、解答は
g:DLI.納品数量計
h:OD.発注番号 = :発注番号
i:GROUP BY DE.発注番号, DD.商品番号
j:ORDER BY ORD.商品番号 です。

誤りやすいポイント

  • COALESCE の第 1 引数をサブクエリのエイリアスなしで書く
    → 納品数量計 だけでは参照先が曖昧になるため減点対象です。
  • GROUP BY に DE.発注番号 だけを書き、DD.商品番号 を漏らす
    → 集計結果が商品単位にならず、SUM が誤った値になります。
  • INNER JOIN と LEFT OUTER JOIN を混同し、納品が 0 件の商品が落ちる
    → 問題の要求は「納品数量が 0 の行も表示」です。
  • ORDER BY を DLI.商品番号 で記述する
    → 外部結合で NULL が混在する場合、並べ替え結果が乱れることがあります。

FAQ

Q: COALESCE と NVL は同じですか?
A: 機能は似ていますが、COALESCE は複数引数を取れる ANSI 標準関数、NVL は 2 引数専用の Oracle 独自関数です。問題文が COALESCE 指定なので従います。
Q: GROUP BY 項目を減らすとどうなりますか?
A: SUM が商品番号の区別なく合算され、1 商品 1 行の要件を満たせなくなります。
Q: ORDER BY をサブクエリ内に書いてもよいですか?
A: SQL の仕様上は可能ですが、外側に ORDER BY を置く方が結果セット全体の並びを保証できるため一般的です。

関連キーワード: LEFT OUTER JOIN, GROUP BY, 集計関数, NULL処理, ORDER BY

設問4

〔返品対応〕について、本文中の下線のある追加したレコードのうち、納品明細表に追加したのはどのようなレコードか。返品に関する情報を記録することを考慮して、30字以内で述べよ。

模範解答

返品した商品の数量をマイナスの値に設定したレコード

解説

解答の論理構成

  1. 返品処理の制約
    【問題文】では、既存レコードを更新せず「①納品表と納品明細表とそれぞれ新しいレコードを追加」と明記されています。つまり、返品分は“追加”で表現する必要があります。
  2. 数量差分の表現方法
    既存レコードを残す条件下で数量を調整する代表的な方法は、差分レコードを登録し、正と負の数量を合算して実在庫を算出する方式です。
  3. 属性との対応付け
    納品明細表には【問題文】図1の列「納品数量」が存在します。ここに返品量を負数で記録すれば、元の納品量と相殺でき、かつ返品の事実(負数レコード)が履歴として残ります。
  4. 解答導出
    以上より、追加する納品明細レコードは「返品した商品の数量をマイナスで登録したもの」と導けます。

誤りやすいポイント

  • 正の数量で新規レコードを追加し、別フラグで区別すると考えてしまう。試験文ではフラグ列の追加が許可されていません。
  • 既存「納品数量」を更新して差し引くと誤解する。更新は禁止と明記されています。
  • 納品表だけに追加し、納品明細表を変更しないと判断してしまう。返品は商品単位で管理するため明細側も必須です。

FAQ

Q: 負数登録はデータ整合性違反になりませんか?
A: トランザクション全体で正味数量が正しく表現できれば問題ありません。論理設計時に「納品数量」は負数を許容する型にしておく前提です。
Q: 返品日をどこに保持しますか?
A: 「納品表」に追加した返品レコードの「納品日時」に返品日を登録します。構造変更なしで日付情報を保持できます。
Q: 返品後に再納品があった場合の在庫計算は?
A: 納品・返品・再納品を時系列で合計します。各レコードの「納品数量」を単純合算することで最新在庫が求められます。

関連キーワード: 差分管理, 履歴保持, 負数在庫, トランザクション
戦国ITクイズ機能

\ せっかくなら /

応用情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてプライバシーポリシー利用規約特商法表記開発者について