令和5年度 秋期 応用情報技術者試験 午後問題 問6 在庫管理システムのE-R図・ウィンドウ関数・SQL

テクノロジデータベース

この問題は2023(R5)秋 応用情報技術者 午後に出題されたものです。出題時点の法令・制度に基づく内容のため、現行の内容と一致しない場合があります。

本ページの問題文・選択肢は、原本の体裁を Web 表示用に正規化しています(改行・記号・数式・図表参照の調整)。設問の趣旨および正解に影響する変更は加えていません。

学習ガイド

在庫の適正化を経営課題に掲げる小売業を題材に、在庫管理システムの改修を通じてデータベース設計の力を問う問題です。凡例に従ってエンティティ間の関連を書き込みE-R図を完成させる設問に始まり、在庫推移の分析に役立つOLAP向けのウィンドウ関数、さらにBNFの構文定義からSQL文を作る設問まで、設計から問合せまでを横断します。この記事では、在庫データを集計するという目的を軸に、各空欄が表1のどのエンティティや構文規則に対応するかを丁寧に確認します。

この記事で押さえる論点

  • 在庫適正化の業務要件からエンティティ間の関連を補いE-R図を完成させる
  • OLAPに役立つウィンドウ関数の動きを説明できる
  • BNFで与えられた構文からSQL文を組み立てる
  • 改修内容に対応するエンティティ名を表から特定する

問題本文

在庫管理システムに関する次の記述を読んで,設問に答えよ。

M社は,ネットショップで日用雑貨の販売を行う企業である。M社では,在庫管理について次の課題を抱えている。

  • 在庫が足りない商品の注文を受けることができず,機会損失につながっている。
  • 商品の仕入れの間隔や個数を調整する管理サイクルが長く,余計な在庫を抱える傾向にある。

〔現状の在庫管理〕

現在,在庫管理を次のように行っている。

  • 商品の注文を受けた段階で,出荷先に最も近い倉庫を見つけて,その倉庫の在庫から注文個数を引き当てる。この引き当てられた注文個数を引当済数という。各倉庫において,引き当てられた各商品単位の個数の総計を引当済総数という。
  • 実在庫数から引当済総数を引いたものを在庫数といい,在庫数以下の注文個数の場合だけ注文を受け付ける。
  • 商品が倉庫に入荷すると,入荷した商品の個数を実在庫数に足し込む。
  • 倉庫から商品を出荷すると,出荷個数を実在庫数から引くとともに引当済総数からも引くことで,引き当ての消し込みを行う。

M社では,月末の月次バッチ処理で毎月の締めの在庫数と売上個数を記録した分析用の表を用いて,商品ごとの在庫数と売上個数の推移を評価している。
また,期末に商品の在庫回転日数を集計して,来期の仕入れの間隔や個数を調整している。

M社では,商品の在庫回転日数を,簡易的に次の式で計算している。

[図表: bb_30_1]

在庫回転日数の計算において,現状では,期間内の平均在庫数として 12 か月分の締めの在庫数の平均値を使用している。

現状の在庫管理システムの E-R 図(抜粋)を図 1 に示す。

図1 現状の在庫管理システムのE-R図(抜粋)
図の説明テキスト

図1 現状の在庫管理システムのE-R図(抜粋)。以下のエンティティと関係が示されている。

【エンティティ(実線下線は主キー、破線下線は外部キー)】

  • 倉庫: 倉庫コード(主), 倉庫名, 所在地
  • 在庫推移状況: 年(主), 月(主), 倉庫コード(主), 商品コード(主), 在庫数, 売上個数
  • 入荷: 入荷番号(主), 倉庫コード(外), 入荷日
  • 入荷明細: 入荷番号(主), 入荷明細番号(主), 商品コード(外), 個数
  • 出荷: 出荷番号(主), 倉庫コード(外), 出荷日, 出荷先情報
  • 出荷明細: 出荷番号(主), 出荷明細番号(主), 商品コード(外), 個数
  • 商品: 商品コード(主), 商品名, 型番, 標準単価
  • 在庫: 倉庫コード(主), 商品コード(主), 実在庫数, 引当済総数

【リレーションシップ】

  • 倉庫 から 在庫推移状況 へ a
  • 倉庫 から 入荷 へ 1対多
  • 入荷 から 入荷明細 へ 1対多
  • 商品 から 入荷明細 へ 1対多
  • 倉庫 から 出荷 へ 1対多
  • 出荷 から 出荷明細 へ 1対多
  • 商品 から 出荷明細 へ 1対多
  • 倉庫 から 在庫 へ 1対多
  • 商品 から 在庫 へ 1対多

【凡例・注記】
リレーションシップの線種(実線: 1対1, 片側矢印: 1対多, 両側矢印: 多対多)および主キー・外部キーの表記ルールについて記載がある。

在庫管理システムのデータベースでは,E-R図のエンティティ名を表名にし,属性名を列名にして,適切なデータ型で表定義した関係データベースによって,データを管理している。

〔在庫管理システム改修内容〕

課題を解決するために,在庫管理システムに次の改修を行うことにした。

  • 在庫数が足りない場合は,倉庫からは引き当てず,予約注文として受け付ける。なお,予約注文ごとに商品を発注することで,注文を受けた商品の個数が入荷される。
  • 商品の仕入れの間隔や個数を調整する管理サイクルを短くするために,在庫の評価を月次から日次の処理に変更して,毎日の締めの在庫数と売上個数を在庫推移状況エンティティに記録する。

現状では,在庫数が足りない商品の予約注文を受けようとしても,在庫引当を行うと実在庫数より引当済総数の方が多くなってしまい,注文に応えられない。そこで,予約注文の在庫引当を商品の入荷のタイミングにずらすために,E-R図に予約注文用の二つのエンティティを追加することにした。追加するエンティティを表1に,改修後の在庫管理システムの E-R 図(抜粋)を図2に示す。

表1 追加するエンティティ

エンティティ名 内容
引当情報 予約注文を受けた商品の個数と入荷済となった商品の個数を管理する。
引当予定 予約注文を受けた商品の,未入荷の引当済数の総計を管理する。
表1 追加するエンティティ
図の説明テキスト

表1 追加するエンティティ
引当情報: 予約注文を受けた商品の個数と入荷済となった商品の個数を管理する。
引当予定: 予約注文を受けた商品の,未入荷の引当済数の総計を管理する。

(※図2のエンティティ構成のテキスト化)
倉庫

  • 倉庫コード
  • 倉庫名
  • 所在地

a

在庫推移状況

  • d
  • 倉庫コード
  • 商品コード
  • 在庫数
  • 売上個数

入荷

  • 入荷番号
  • 倉庫コード
  • 入荷日

出荷

  • 出荷番号
  • 倉庫コード
  • 出荷日
  • 出荷先情報

入荷明細

  • 入荷番号
  • 入荷明細番号
  • 引当番号
  • 商品コード
  • 個数

出荷明細

  • 出荷番号
  • 出荷明細番号
  • 商品コード
  • 個数

b

  • 引当番号
  • 倉庫コード
  • 商品コード
  • 引当済数
  • 入荷済数

商品

  • 商品コード
  • 商品名
  • 型番
  • 標準単価

在庫

  • 倉庫コード
  • 商品コード
  • 実在庫数
  • 引当済総数

c

  • 倉庫コード
  • 商品コード
  • 未入荷引当済総数

注記 新規に追加したエンティティは太枠で表す。

図2 改修後の在庫管理システムの E-R 図(抜粋)

図2 改修後の在庫管理システムの E-R 図(抜粋)
図の説明テキスト

図2 改修後の在庫管理システムの E-R 図(抜粋)。図1からエンティティが追加・変更されている。
追加・変更箇所:

  • 倉庫と在庫推移状況の間のリレーションに a
  • 在庫推移状況の属性に d が追加
  • エンティティ b が追加され、属性は 引当番号, 倉庫コード, 商品コード, 引当済数, 入荷済数。入荷明細と商品から参照されている。
  • エンティティ c が追加され、属性は 倉庫コード, 商品コード, 未入荷引当済総数。商品から参照されている。

在庫管理システムにおける予約注文を受けた商品の個数に関する処理内容を表2に示す。

表2 在庫管理システムにおける予約注文を受けた商品の個数に関する処理内容

処理タイミング 処理内容
予約注文を受けたとき 引当情報エンティティのインスタンスを生成して,引当済数には注文を受けた商品の個数を,入荷済数には 0 を設定する。
引当予定エンティティの未入荷引当済総数に注文を受けた商品の個数を足す。
予約注文された商品が入荷したとき eエンティティの未入荷引当済総数から入荷した商品の個数を引く。
fエンティティの実在庫数と引当済総数に入荷した商品の個数を足す。
入荷した商品の個数をgエンティティの個数に設定し,引当情報エンティティのhに足す。
予約注文された商品を出荷したとき 出荷した商品の個数を出荷明細エンティティの個数に設定し,在庫エンティティの商品の実在庫数及び引当済総数から引く。
表2 在庫管理システムにおける予約注文を受けた商品の個数に関する処理内容
図の説明テキスト

表2 在庫管理システムにおける予約注文を受けた商品の個数に関する処理内容。
処理タイミングと処理内容の対応表。

  • 予約注文を受けたとき: 引当情報エンティティのインスタンスを生成して...引当予定エンティティの未入荷引当済総数に...
  • 予約注文された商品が入荷したとき: eエンティティの未入荷引当済総数から... fエンティティの実在庫数と... gエンティティの個数に設定し... hに足す。
  • 予約注文された商品を出荷したとき: 出荷した商品の個数を出荷明細エンティティの個数に設定し...

〔在庫の評価〕

より正確かつ迅速に在庫回転日数を把握するために,在庫推移状況エンティティから,期間を1週間(7日間)として,倉庫コード,商品コードごとに,各年月日の6日前から当日までの平均在庫数及び売上個数で在庫回転日数を集計することにする。
可読性を良くするために,SQL文にはウィンドウ関数を使用することにする。
ウィンドウ関数を使うと,FROM句で指定した表の各行ごとに集計が可能であり,各行ごとに集計期間が異なるような移動平均も簡単に求めることができる。ウィンドウ関数で使用する構文(抜粋)を図3に示す。

<ウィンドウ関数>::=
  <ウィンドウ関数名>(<列>) OVER {<ウィンドウ名> | (<ウィンドウ指定>)}

<WINDOW 句>::=
  WINDOW <ウィンドウ名> AS (<ウィンドウ指定>) [{, <ウィンドウ名> AS (<ウィンドウ指定>)}...]

<ウィンドウ指定>::=
  [<PARTITION BY 句>] [<ORDER BY 句>] [<ウィンドウ枠>]

<PARTITION BY 句>::=
  PARTITION BY <列> [{, <列>}...]

注記1 OVER の後に(<ウィンドウ指定>)を記載する代わりに, WINDOW 句で名前を付けて, <ウィンドウ名>で参照することができる。
注記2 PARTITION BY 句は指定した列の値ごとに同じ値をもつ行を部分集合としてパーティションにまとめるオプションである。
注記3 ウィンドウ枠の例として, ROWS BETWEEN n PRECEDING AND CURRENT ROW と記載した場合は, n 行前(n PRECEDING)から現在行(CURRENT ROW)までの範囲を対象として集計することを意味する。
注記4 ...は, 省略符号を表し, 式中で使用される要素を任意の回数繰り返してもよいことを示す。

図3 ウィンドウ関数で使用する構文 (抜粋)

ウィンドウ関数を用いて,倉庫コード,商品コードごとに,各年月日の6日前から当日までの平均在庫数及び売上個数を集計するSQL文を図4に示す。

図3 ウィンドウ関数で使用する構文 (抜粋)
図の説明テキスト

図3 ウィンドウ関数で使用する構文 (抜粋)。ウィンドウ関数の構文規則と注記が記載されている。

SELECT 年, 月, 日, 倉庫コード, 商品コード,
       AVG(在庫数) <span id="q6_blank_i" class="blank-label">i</span> 期間定義 AS 平均在庫数,
       SUM(売上個数) <span id="q6_blank_i" class="blank-label">i</span> 期間定義 AS 期間内売上個数
FROM 在庫推移状況
WINDOW 期間定義 AS (
                PARTITION BY 倉庫コード, 商品コード
                <span id="q6_blank_j" class="blank-label">j</span> 年, 月, 日 ASC
                ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
                )

図4 倉庫コード, 商品コードごとに, 各年月日の6日前から当日までの平均在庫数及び売上個数を集計するSQL文

図4 倉庫コード, 商品コードごとに, 各年月日の6日前から当日までの平均在庫数及び売上個数を集計するSQL文
図の説明テキスト

図4 倉庫コード, 商品コードごとに, 各年月日の6日前から当日までの平均在庫数及び売上個数を集計するSQL文。空欄 i, j が含まれている。

設問と解答・解説

設問1

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

模範解答

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 正解の記号(↓)と完全に一致している。
  • 1: 解答の意図は合っているが、指定された凡例とわずかに異なる表記となっているなど、完全な一致ではない。
  • 0: 無解答、または正解と異なる内容である。

解説

解説

E-R図において、エンティティ間の関係性(カーディナリティ)を表現する記法を答える問題です。

  • 図1のE-R図および凡例を参照し、関連を示す線の引き方や矢印の向きを正しく読み取る必要があります。
  • エンティティ間の「1対多」などの対応関係を業務要件から分析し、正しい記号を選択します。

高得点のポイント

  • 問題文の指定通り、図1の凡例に示された表記ルールに厳密に従って解答していること
  • エンティティ間の参照関係を正確に理解し、正しい方向の矢印を示していること

設問2

(1)

図2中の b に入れる適切なエンティティ名を表1中のエンティティ名を用いて答えよ。

模範解答

引当情報

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 正解(引当情報)と完全に一致している。
  • 1: 解答の意図は合っているが、余分な文字が含まれるなど、完全な一致ではない。
  • 0: 無解答、または正解と異なる内容である。

解説

解説

在庫管理システムの改修に伴い、追加されるエンティティを特定する問題です。

  • 新たな業務要件に基づき、どのデータ構造が必要になるかをE-R図の構造から推測します。
  • 関連するエンティティ同士を結びつける役割を持つものを表1の中から探し出し、引当情報を導出します。

高得点のポイント

  • 在庫引当の業務フローを理解し、必要なエンティティの関連性を正確に把握していること
  • 表1に存在するエンティティ名を正確に抜き出して解答していること

(2)

図2中の c に入れる適切なエンティティ名を表1中のエンティティ名を用いて答えよ。

模範解答

引当予定

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 正解(引当予定)と完全に一致している。
  • 1: 解答の意図は合っているが、余分な文字が含まれるなど、完全な一致ではない。
  • 0: 無解答、または正解と異なる内容である。

解説

解説

エンティティの関連性を問う問題です。

  • 「引当情報」エンティティがどのデータと紐づくべきかを考えます。在庫の引当を行う単位や予定を管理するためのエンティティが必要です。
  • 全体のリレーションシップの整合性から、該当箇所には引当予定が入ることがわかります。

高得点のポイント

  • 在庫管理における「引当」のプロセスと必要なデータ構造のつながりを正確に理解していること
  • 指定通り、表1に存在するエンティティ名を過不足なく解答していること

(3)

図2中の d に入れる,在庫推移状況エンティティに追加すべき適切な属性名を答えよ。なお,属性名の表記は図1の凡例に従うこと。

模範解答

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 正解(日)と完全に一致している。
  • 1: 解答の意図は合っているが、余分な文字が含まれるなど、完全な一致ではない。
  • 0: 無解答、または正解と異なる内容である。

解説

解説

追加された「在庫推移状況」エンティティに必要な属性名を特定する問題です。

  • 「推移」を管理・記録するためには、対象となる時系列の時点(日付など)を識別するためのキー項目が不可欠です。
  • E-R図の構造やほかのエンティティのキー構成を参考に、適切にという属性を導き出します。

高得点のポイント

  • 時系列データを扱うエンティティにおいて必須となる属性(時間・日付)を正確に推測できていること
  • 図1の凡例(主キーには下線など)に従った正確な名称で解答できていること

(4)

表2中の e に入れる適切な字句を答えよ。

模範解答

引当予定

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 正解(引当予定)と完全に一致している。
  • 1: 解答の意図は合っているが、余分な文字が含まれるなど、完全な一致ではない。
  • 0: 無解答、または正解と異なる内容である。

解説

解説

在庫管理システムにおける処理内容や状態の変化を記述した表の空欄を埋める問題です。

  • 業務プロセス(受注、引当、入荷、出荷など)に伴い、どのデータが更新または参照されるかを読み解きます。
  • 文脈および前後関係から、処理の対象となるのは引当予定のデータであることが特定できます。

高得点のポイント

  • システムの仕様や状態遷移の記述から、対象となるエンティティやデータを正確に読み取れていること

(5)

表2中の f に入れる適切な字句を答えよ。

模範解答

在庫

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 正解(在庫)と完全に一致している。
  • 1: 解答の意図は合っているが、余分な文字が含まれるなど、完全な一致ではない。
  • 0: 無解答、または正解と異なる内容である。

解説

解説

表2の処理内容の記述において、適切な対象データを特定する問題です。

  • 引当処理や入出庫処理が完了した際、最終的に数量の増減が反映される対象は在庫データです。
  • 業務要件の説明文から、どのエンティティのどの属性が影響を受けるかを正確にトレースします。

高得点のポイント

  • 実在庫や引当可能数などの計算ロジックに基づき、更新対象となるデータを正確に特定できていること

(6)

表2中の g に入れる適切な字句を答えよ。

模範解答

入荷明細

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 正解(入荷明細)と完全に一致している。
  • 1: 解答の意図は合っているが、余分な文字が含まれるなど、完全な一致ではない。
  • 0: 無解答、または正解と異なる内容である。

解説

解説

商品の入荷処理に関連して、処理の起点または対象となる明細データを答える問題です。

  • 在庫を増加させるトランザクションデータとして、システムに登録されるのは入荷明細です。
  • E-R図上のトランザクション系エンティティの役割と表の記述を対応付けて判断します。

高得点のポイント

  • 入荷業務のプロセスを理解し、該当するトランザクションエンティティを正確に抜き出せていること

(7)

表2中の h に入れる適切な字句を答えよ。

模範解答

入荷済数

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 正解(入荷済数)と完全に一致している。
  • 1: 解答の意図は合っているが、余分な文字が含まれるなど、完全な一致ではない。
  • 0: 無解答、または正解と異なる内容である。

解説

解説

表2における、具体的な属性名や更新項目を答える問題です。

  • 入荷処理が実行された結果として加算・更新されるべき数値項目は何かを考察します。
  • 他のエンティティの属性や処理の文脈から、更新対象となるのは入荷済数であることがわかります。

高得点のポイント

  • データ更新ロジックの記述から、過不足なく対象の属性名を特定し、正確な字句で解答していること

設問3

(1)

図4中の i に入れる適切な字句を答えよ。

模範解答

OVER

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 正解(OVER)と完全に一致している。
  • 1: 解答の意図は合っているが、余分な文字が含まれるなど、完全な一致ではない。
  • 0: 無解答、または正解と異なる内容である。

解説

解説

SQLにおいて、OLAP用途で用いられるウィンドウ関数の構文を問う問題です。

  • ウィンドウ関数を用いて集計範囲や順序を指定する際、集計関数の後には OVER 句を記述します(例:SUM(数量) OVER (...))。
  • 講評にもあるように、WINDOW 句と混同する受験者が散見されました。WINDOW 句は名前付きウィンドウを定義する場合に用いられるものであり、提示されたBNF(バッカス・ナウア記法)の構文規則を追うことで、正答が OVER であることを正確に導き出す必要があります。

高得点のポイント

  • ウィンドウ関数の基礎的なSQL構文を正確に暗記し、理解していること
  • 与えられたBNFの記述から構文要素を適切に読み取れていること

(2)

図4中の j に入れる適切な字句を答えよ。

模範解答

ORDER BY

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 正解(ORDER BY)と完全に一致している。
  • 1: 解答の意図は合っているが、余分な文字が含まれるなど、完全な一致ではない。
  • 0: 無解答、または正解と異なる内容である。

解説

解説

SQLのウィンドウ関数内(OVER 句内)で使用される、順序付けのための構文を答える問題です。

  • 累計や移動平均などを計算する場合、処理する行の順番を確定させる必要があり、そのためには ORDER BY 句を使用します。
  • BNFの定義からも、ウィンドウ関数内で並べ替えを行う要素として ORDER BY が該当することがわかります。

高得点のポイント

  • 分析用のSQLにおいて、行の処理順序を制御するための ORDER BY の用法を正しく理解していること
  • BNFの構造を読み解き、適切なキーワードを抽出できていること

設問3のiは,正答率がやや低かった。“WINDOW”と誤って解答した受験者が散見された。BNFを正しく読み解き,正答を導き出してほしい。近年,データベースに蓄積されたデータの分析・活用がますます重要になっているので,ウィンドウ関数の利用方法は是非身につけてほしい。