令和7年度 春期 応用情報技術者試験 午後 問6 販売管理システムのE-RとSQL集計

テクノロジデータベース

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

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

学習ガイド

データドリブンマーケティングを志向する販売管理システムの構築を題材に、E-R図とSQLを問うデータベースの問題です。キャンペーン種別ごとの実績集計や売上実績の降順出力といったSQL文の空欄補充が中心で、欲しい出力結果から逆算してSELECT句・結合・集計の各部品を決める読み方が有効です。この記事では、E-R図の関連の答えがSQLの結合条件にどう現れるかという連動関係も確認しながら解説します。

この記事で押さえる論点

  • キャンペーン管理の要件をE-R図の属性・関連へ反映する
  • CASE式や集計関数を使うSQL文の空欄を埋める
  • データ分析の要件変更への対応を設計として説明する

問題本文

問6 販売管理システムの構築に関する次の記述を読んで,設問に答えよ。

H社は,全国の店舗及びインターネットで釣り具の販売を行っている。これまで販売促進のためにキャンペーンを定期的に実施してきたが,売上に全く結びつかないものもあった。そこで,キャンペーンの機能を強化し,さらにその効率を上げるために,既存の販売管理システムを改修した新しい販売管理システム(以下,新システムという)を構築することになった。

〔キャンペーンの概要〕

キャンペーンとは,2週間~3か月間の定められた期間,いくつかの商品に安い売価を設定することで,新規会員の獲得や,他の商品も一緒に購入してもらうことによる売上の向上を目指す活動である。
新システムで提供するキャンペーンを広報する手段は4種類あり,種別と呼ばれる英字1字で分類される。新システムで提供するキャンペーン種別について,表1に示す。

表1 新システムで提供するキャンペーン種別
図の説明テキスト
種別 種別名 概要
H 葉書 キャンペーンについて、特定の会員に葉書で案内する。
全国の店舗及びインターネットでの販売が対象の場合、直近1年以内に購入した実績がある会員に案内する。
特定地域の店舗が対象の場合、店舗ごとに決められた範囲(以下、店舗エリアという)に住む会員に案内する。店舗エリアは、その店舗に来客が見込まれる会員の居住範囲を複数の郵便番号で定めた範囲として定義する。店舗エリアの範囲は、最初に対象店舗の半径5km以内の地域に該当する郵便番号を登録し、定期的に見直す。
E 電子メール キャンペーンについて、全ての会員に電子メールで案内する。案内の内容は、会員の住所や購入実績に応じてカスタマイズする。
B バナー広告 釣り情報のWebサイトやソーシャルメディアにバナー広告を表示して、キャンペーンをアピールする。
L リスティング広告
(検索連動型広告)
Webサイトの検索エンジンにおいて、釣り関連のキーワードを入力した際、検索結果にURLリンク付きのテキストを表示して、キャンペーンをアピールする。

各キャンペーンには,目標となる複数の指標と予算を設定し,その実施を複数回に分けて行うことがある。その予算を各種別に配賦する割合を変えることによって目標達成率を上げる工夫が求められる。

バナー広告とリスティング広告のキャンペーン(以下,Webキャンペーンという)は,キャンペーン単位で広告内容と予算金額を設定してから,Webマーケティングを運営するT社に実施の詳細を委託する。T社からは,広告内容として設定した広告表示位置やキーワードごとに,その広告費用や表示回数,クリック数などの実績を週次で集計したレポートが送付される。

新システムのE-R図(抜粋)を図1に示す。なお,新システムでは,E-R図のエンティティ名を表名にし,属性名を列名にして,適切なデータ型で表定義した関係データベースによって,データを管理する。

図1 新システムのE-R図(抜粋)
図の説明テキスト

エンティティと属性、およびリレーションシップを示したE-R図。

[エンティティと属性]

  • 店舗エリア詳細:店舗エリア番号(主キー), a
  • 店舗エリア:店舗エリア番号(主キー), 店舗エリア名
  • 店舗:店舗番号(主キー), 店舗エリア番号(外部キー), 店舗郵便番号, 店舗住所
  • 会員:会員番号(主キー), 会員郵便番号, 会員住所, 会員メールアドレス
  • 売上:売上番号(主キー), 店舗番号(外部キー), 売上年月日, 会員番号(外部キー), キャンペーン番号(外部キー), キャンペーン種別
  • 売上明細:売上番号(主キー・外部キー), 売上明細番号(主キー), 商品番号(外部キー), 商品個数, 商品単価
  • 商品:商品番号(主キー), 商品名, 商品種別, 商品標準売価, 商品原価
  • キャンペーン:キャンペーン番号(主キー), キャンペーン名, 目標会員獲得数, 目標売上向上金額, 目標利益向上金額, 予算金額, 開始年月日, 終了年月日
  • キャンペーン実施:キャンペーン番号(主キー・外部キー), キャンペーン実施番号(主キー), キャンペーン種別, キャンペーン実施金額, 開始年月日, 終了年月日
  • キャンペーン商品:キャンペーン番号(主キー・外部キー), キャンペーン商品番号(主キー), キャンペーン商品売価

[リレーションシップ]

  • 店舗エリアから店舗エリア詳細へ 1対1 の線(店舗エリア側が矢印)
  • 店舗エリアから店舗へ 1対多 の矢印
  • 会員から売上へ 1対多 の矢印
  • 店舗から売上へ 1対多 の矢印
  • キャンペーンから売上へ 1対多 の矢印
  • 売上から売上明細へ 1対多 の矢印
  • 商品から売上明細へ 1対多 の矢印
  • キャンペーンからキャンペーン実施へ 1対多 の矢印
  • キャンペーンからキャンペーン商品へ 1対多 の矢印
  • 商品からキャンペーン商品の間の線上に空欄 b が存在する

[凡例]

  • 線のみ:1対1
  • 片側矢印:1対多
  • 両側矢印:多対多

[注記]
属性名の実線の下線は主キー、破線の下線は外部キーを示す。主キーの実線が付いている属性名には、外部キーの破線を付けない。

〔キャンペーン種別ごとの実績の集計〕

新しいキャンペーンを計画するために,指定したキャンペーンについて,キャンペーン種別ごとの実績として,売上,原価,粗利,実施金額を集計するSQL文を図2に示す。ここで,“:キャンペーン番号”は指定したキャンペーン番号を表す埋込み変数である。なお,関数COALESCE(A, B)は,AがNULLでないときはAを,AがNULLのときはBを返す。

図2 キャンペーン種別ごとの実績を集計する SQL 文
図の説明テキスト
SELECT CK.キャンペーン種別, COALESCE(UK.売上計,0) AS 売上計,
  COALESCE(UK.原価計,0) AS 原価計,
  COALESCE(UK.売上計,0) - COALESCE(UK.原価計,0) AS 粗利計,
  CK.キャンペーン実施金額計
  <span id="q6_blank_c" class="blank-label">c</span>
(SELECT キャンペーン種別, SUM(キャンペーン実施金額) AS キャンペーン実施金額計
 FROM キャンペーン実施
 WHERE キャンペーン番号 = :キャンペーン番号
 GROUP BY キャンペーン種別) CK
  <span id="q6_blank_d" class="blank-label">d</span>
(SELECT U.キャンペーン種別, SUM(M.商品個数 * M.商品単価) AS 売上計,
  <span id="q6_blank_e" class="blank-label">e</span> AS 原価計
 FROM 売上 U
  INNER JOIN 売上明細 M ON U.売上番号 = M.売上番号
  INNER JOIN 商品 S ON M.商品番号 = S.商品番号
 WHERE U.キャンペーン番号 = :キャンペーン番号
 GROUP BY U.キャンペーン種別) UK
ON CK.キャンペーン種別 = UK.キャンペーン種別

〔葉書を送る店舗エリアの見直し〕

葉書を送る対象となる店舗エリアを,葉書キャンペーンによる会員の購入実績を基に見直すことを考える。対象の店舗における過去1年間に葉書キャンペーンで購入した会員の郵便番号ごとの売上実績数を,売上実績数の降順に出力するSQL文を図3に示す。ここで,“:店舗番号”は指定した店舗番号を,“:一年前年月日”は現在から1年前の年月日を表す埋込み変数である。

図3 売上実績数を降順に出力する SQL 文
図の説明テキスト
SELECT K.会員郵便番号, COUNT(*) AS 売上実績数
FROM 売上 U INNER JOIN 会員 K ON U.会員番号 = K.会員番号
WHERE U.店舗番号 = :店舗番号
AND U.売上年月日 >= :一年前年月日
  <span id="q6_blank_f" class="blank-label">f</span>
GROUP BY K.会員郵便番号
  <span id="q6_blank_g" class="blank-label">g</span>

〔Webキャンペーン内容の定期的な見直しの検討〕

Webキャンペーンの効果をより高めるために、T社から送付されるレポートを基に、キャンペーン期間中に広告内容を適宜変更する依頼をT社に出すことを考える。Webキャンペーンの実績を記録するために追加した表の構造を図4に示す。

図4 Webキャンペーンの実績を記録するために追加した表の構造
図の説明テキスト

Webキャンペーン実績 (キャンペーン番号, キャンペーン実施番号, キャンペーン種別, 広告番号, 実績年月日, 広告表示位置, キーワード, 広告費用, 表示回数, クリック数, 会員登録数)

注記 下線は主キーを示す。

レビューを実施したところ、Webキャンペーン実績表は日次で実績を集計する想定になってしまっているので見直す必要がある、との指摘を受けた。
その後、受けた指摘に対応することで、目的の機能を実装することができた。

設問と解答・解説

設問1

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

(1)

空欄aに入れる適切な属性名を答えよ。

模範解答

店舗エリア郵便番号

採点基準(配点 3点)

知識・理解度(内容)(2点)

  • 2: 「店舗エリア郵便番号」を完全な形で解答し、指定された記法を満たしている。
  • 1: 「郵便番号」など、要素を一部含んでいるが完全ではない。
  • 0: 属性名を正しく特定できていない。

論理性(構造)(1点)

  • 1: E-R図のエンティティ間関連(1対多)を踏まえた論理的な属性の導出ができている。
  • 0: 関連を踏まえた導出ができていない。

解説

E-R図において、店舗エリア表から店舗エリア詳細表への関連は1対多であることが読み取れます。
したがって、空欄aには外部キーとして機能する属性名が入るべきです。

  • 図1の凡例に従い、主キーであることを示す実線の下線を付す等の指定があれば、それに従う必要があります。
  • サブクエリやテーブル定義など、関係する他の情報を参照して正確な属性名を特定します。

高得点のポイント

  • 1対多の関連性を正しく理解し、必要な外部キー属性(店舗エリア郵便番号)を特定できていること。
  • 問題文の指示(図1の凡例に倣うこと)を順守していること。

(2)

空欄bに入れるエンティティ間の関連を答えよ。

模範解答

採点基準(配点 3点)

知識・理解度(内容)(2点)

  • 2: エンティティ間の関連を正しく把握し、「→」を完全に記述できている。
  • 1: 関連の方向性や多重度の理解が不十分な記号となっている。
  • 0: 適切でない記号が解答されている。

論理性(構造)(1点)

  • 1: 凡例に規定された記法に則り、論理的なE-R図の構造を表現できている。
  • 0: 凡例の記法に則った論理的表現ができていない。

解説

空欄bには、エンティティ間の関連を示す記号が入ります。

  • データモデルの構造上、一方のエンティティに対する他方の多重度を考慮する必要があります。
  • 本問では1対多の関連などを表現するため、図1の凡例に基づき適切な矢印などの記号(ここでは )を選択します。

高得点のポイント

  • テーブル間の関連や多重度を正確に読み取っていること。
  • 指定された凡例に厳密に従って記号を記述していること。

設問1 aは,正答率が低かった。属性名が主キーであることを示す,実線の下線が付いていない解答が散見された。店舗エリア表から店舗エリア詳細表への関連が1対多であることや設問の指示に注意して解答してほしい。

設問2

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

(1)

模範解答

FROM

採点基準(配点 2点)

知識・理解度(内容)(1点)

  • 1: SQL文の基本句である「FROM」を正しく記述できている。
  • 0: 適切でない解答。

論理性(構造)(1点)

  • 1: 文脈から、SELECT句に続くデータ取得元の指定であるというSQLの論理構造を正しく判断できている。
  • 0: SQLの論理構造を正しく判断できていない。

解説

SQL文の最も基本的な構成要素を問う問題です。

  • SELECT 句で指定された列を取得する対象となるテーブル群を指定するためには、FROM 句が必要です。
  • 前後の構文から、テーブル名や副問合せが続く箇所であることを読み取ります。

高得点のポイント

  • SQLの基本構文である SELECT ... FROM ... の構造を確実に理解していること。
  • 前後の文脈から不足している予約語を正確に特定できていること。

(2)

模範解答

LEFT OUTER JOIN

採点基準(配点 2点)

知識・理解度(内容)(1点)

  • 1: 売上に結びつかないキャンペーンを含めるための「LEFT OUTER JOIN」を正しく記述できている。
  • 0: 適切でない解答。

論理性(構造)(1点)

  • 1: 副問合せ間の関連や多重度を考慮し、論理的に適切な結合方式を選択できている。
  • 0: 結合方式の選択が不適切。

解説

実施したキャンペーンの中で、売上に結びつかないもの(売上実績がないもの)も結果に含める必要がある点が重要です。

  • 単純な INNER JOIN では、売上のないキャンペーンが結果から抜け落ちてしまいます。
  • 基準となる表を全て残すため、外部結合(OUTER JOIN) を用います。
  • 結合の左側にキャンペーン側の表が位置するため、LEFT OUTER JOIN が正解となります。

高得点のポイント

  • 「売上に結びつかないものもあった」という要件から、外部結合の必要性を導出できていること。
  • テーブルの記述順序に応じた適切な外部結合の方向(LEFT)を指定できていること。

(3)

模範解答

SUM(M.商品個数 * S.商品原価)

採点基準(配点 2点)

知識・理解度(内容)(1点)

  • 1: 「SUM(M.商品個数 * S.商品原価)」を構成する要素(列名、演算子、集計関数)を正しく記述できている。
  • 0: 適切でない解答。

論理性(構造)(1点)

  • 1: テーブルのエイリアス(M, S)を正しく用い、SQL文として論理的に正しい構文を組み立てられている。
  • 0: 構文が正しくない、またはエイリアスの指定に誤りがある。

解説

売上に関連する原価の総計を算出するための集計式を記述する問題です。

  • 1明細あたりの原価は「商品個数」と「商品原価」を掛け合わせることで求められます。
  • これらを合計するために、集計関数の SUM を使用します。
  • 同じ列名が存在する可能性やSQLの正確性を担保するため、テーブルエイリアス(MS)を正しく付与することが求められます。

高得点のポイント

  • 必要な列を用いた乗算式(商品個数 * 商品原価)を正しく構築できていること。
  • 集計関数 SUM() で全体を囲んでいること。
  • 各列に対して適切なテーブルエイリアスを修飾していること。

設問2 cは,正答率が高かったが,dは,正答率が低かった。副問合せ間を結合する際,関連や多重度まで考えることが重要である。実施したキャンペーンに対して売上に結びつかないものもあった点について,よく考えて適切なSQL文を組み立てて記述してほしい。

設問3

図3中の f , g に入れる適切な字句を答えよ。

(1)

模範解答

AND U.キャンペーン種別 = 'H'

採点基準(配点 3点)

知識・理解度(内容)(2点)

  • 2: 抽出条件として「AND U.キャンペーン種別 = 'H'」を正確に記述できている。
  • 1: 条件式の構成要素(列名、演算子、値)に一部不足や不正確な点がある。
  • 0: 適切でない解答。

論理性(構造)(1点)

  • 1: 表の各列に格納されているデータを意識し、論理的に正しいSQLの条件式として成立している。
  • 0: SQLの条件式として成立していない。

解説

特定の条件に合致するデータのみを抽出するための WHERE 句(または結合条件)の追加部分です。

  • 対象となるキャンペーン種別(ここでは 'H')を絞り込むための条件を記述します。
  • 前に別の条件が存在する場合、論理演算子 AND を用いて条件を結合する必要があります。
  • 表の構造を正しく理解し、エイリアス U を用いて列名を正確に指定します。

高得点のポイント

  • キャンペーン種別を絞り込む条件式(= 'H')を正しく記述できていること。
  • 既存の条件と正しく結びつけるための AND を含めていること。
  • 文字列リテラルを適切に引用符で囲んでいること。

(2)

模範解答

ORDER BY 売上実績数 DESC

採点基準(配点 3点)

知識・理解度(内容)(2点)

  • 2: 「ORDER BY 売上実績数 DESC」を完全に記述し、ソート順の指定が正しい。
  • 1: ORDER BY句は記述されているが、列名や降順の指定(DESC)に誤りや不足がある。
  • 0: 適切でない解答。

論理性(構造)(1点)

  • 1: 求められている結果の並び順に適合するよう、論理的に正しいSQL句を構成できている。
  • 0: ソートのロジックが不適切。

解説

抽出した結果セットを要件に合わせて並べ替えるための句を記述します。

  • 「売上実績数の多い順」という要件から、並べ替えキーは 売上実績数 となります。
  • 「多い順」すなわち降順であるため、ORDER BY 句の末尾に DESC を指定する必要があります。

高得点のポイント

  • 並べ替えを指定する ORDER BY 句を正しく使用していること。
  • ソートキーとして 売上実績数 を指定していること。
  • 降順を意味するキーワード DESC を忘れずに付与していること。

設問3 fは,正答率がやや低かった。SQL文を考える上で,表の各列にどのようなデータが格納されているのかを意識することが,正しいSQL文を記述する上で重要であることを理解してほしい。

設問4

本文中の下線①について、対応した内容を35字以内で答えよ。

模範解答

Webキャンペーン実績表の集計粒度を日次から週次に修正する。

採点基準(配点 2点)

知識・理解度(内容)(1点)

  • 1: 対象となる表(Webキャンペーン実績表)と、変更内容(集計粒度を日次から週次に修正)を正しく把握できている。
  • 0: 対象や変更内容の把握が不適切。

論理性(構造)(1点)

  • 1: 指定された文字数制限の中で、日本語として論理的かつ簡潔に要約できている。
  • 0: 記述の論理構造に問題がある。

解説

システム構築・運用におけるデータ設計の留意事項に関する問題です。

  • データ収集・分析の要件変更や、処理性能・ストレージ容量の最適化の観点から、データの保持単位(集計粒度)を見直す場面が問われています。
  • 課題文から、これまで「日次」で集計していたWebキャンペーン実績表のデータを、より粗い「週次」の粒度にまとめる対応が必要であることが読み取れます。

高得点のポイント

  • 対象となるテーブル名(Webキャンペーン実績表)を明記していること。
  • 何をどのように変更するのか(集計粒度を日次から週次に修正)を具体的に記述していること。
  • 35字以内という字数制限を満たし、簡潔な文で表現できていること。