令和7年春期試験午後問題 問6

問6 データベース

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

〔キャンペーンの概要〕
 キャンペーンとは,2週間~3か月間の定められた期間,幾つかの商品に安い売価を設定することで,新規会員の獲得や,他の商品も一緒に購入してもらうことによる売上の向上を目指す活動である。
 新システムで提供するキャンペーンを広報する手段は4種類あり,種別と呼ばれる英字1字で分類される。新システムで提供するキャンペーン種別について,表1に示す。
pm06_1.png
 各キャンペーンには,目標となる複数の指標と予算を設定し,その実施を複数回に分けて行うことがある。その予算を各種別に配賦する割合を変えることによって目標達成率を上げる工夫が求められる。
 バナー広告とリスティング広告のキャンペーン(以下,Webキャンペーンという)は,キャンペーン単位で広告内容と予算金額を設定してから,Webマーケティングを運営するT社に実施の詳細を委託する。T社からは,広告内容として設定した広告表示位置やキーワードごとに,その広告費用や表示回数,クリック数などの実績を週次で集計したレポートが送付される。
 新システムのE-R図(抜粋)を図1に示す。なお,新システムでは,E-R図のエンティティ名を表名にし,属性名を列名にして,適切なデータ型で表定義した関係データベースによって,データを管理する。
pm06_2.png
〔キャンペーン種別ごとの実績の集計〕
 新しいキャンペーンを計画するために,指定したキャンペーンについて,キャンペーン種別ごとの実績として,売上,原価,粗利,実施金額を集計するSQL文を図2に示す。ここで,":キャンペーン番号"は指定したキャンペーン番号を表す埋込み変数である。なお,関数COALESCE(A,B)は,AがNULLでないときはAを,AがNULLのときはBを返す。
pm06_3.png
〔葉書を送る店舗エリアの見直し〕
 葉書を送る対象となる店舗エリアを,葉書キャンペーンによる会員の購入実績を基に見直すことを考える。対象の店舗における過去1年間に葉書キャンペーンで購入した会員の郵便番号ごとの売上実績数を,売上実績数の降順に出力するSQL文を図3に示す。ここで,":店舗番号"は指定した店舗番号を,":一年前年月日"は現在から1年前の年月日を表す埋込み変数である。
pm06_4.png
〔Webキャンペーン内容の定期的な見直しの検討〕
 Webキャンペーンの効果をより高めるために,T社から送付されるレポートを基に,キャンペーン期間中に広告内容を適宜変更する依頼をT社に出すことを考える。Webキャンペーンの実績を記録するために追加した表の構造を図4に示す。
pm06_5.png
 レビューを実施したところ,Webキャンペーン実績表は日次で実績を集計する想定になってしまっているので見直す必要がある,との指摘を受けた。
 その後,①受けた指摘に対応することで,目的の機能を実装することができた。

設問1

図1中のabに入れる適切な属性名及びエンティティ間の関連を答え,E-R図を完成させよ。なお,属性名及びエンティティ間の関連の表記は,図1の凡例に倣うこと。
(※正誤判定の都合上、主キー属性は{属性名}、外部キー属性は(属性名)と入力してください)

解答例・解答の要点

a:店舗エリア郵便番号
b:

解説

aについて〕
店舗エリアエンティティと店舗エリア詳細エンティティが「1対多」の関係をもっていることに注目します。

1つの店舗が複数もつ要素を本文中から探すと、表1の種別Hの概要に「店舗エリアは,その店舗に来客が見込まれる会員の住居範囲を複数の郵便番号で定めた範囲として定義する」とあります。1つの店舗エリア番号には複数の郵便番号が紐づき、また見直しによる変動があるため、別途店舗エリア詳細エンティティで郵便番号の集合を管理していると考えられます。したがって、郵便番号が空欄aに入る属性となります。

図1には郵便番号に関連する属性として、店舗エンティティの「店舗郵便番号」、会員エンティティの「会員郵便番号」があり、いずれも「主体+郵便番号」の形式となっています。単に「郵便番号」としてしまうと区別がつかないため、命名規則に従えば、店舗エリア詳細エンティティがもつ属性は「店舗エリア郵便番号」とするのが妥当です。

店舗エリア詳細エンティティには店舗エリア番号が同じで、郵便番号が異なる複数の組が存在することになりますから、各組を一意に特定するため、「店舗エリア郵便番号」は主キーとする必要があります。したがって、空欄aには「店舗エリア郵便番号」が入ります。

a店舗エリア郵便番号

bについて〕
商品エンティティとキャンペーン商品エンティティには共通の値を保持する属性「(キャンペーン)商品番号」があります。この属性「(キャンペーン)商品番号」は、商品エンティティ側では主キーであり、商品を一意に特定します。また、キャンペーン商品エンティティ側では「キャンペーン番号」属性とともに(複合)主キーであり、キャンペーンと商品の組を一意に特定します。

〔キャンペーンの概要〕に「各キャンペーンには,…,その実施を複数回に分けて行うことがある」とあるように、1つの商品について複数回のキャンペーンを行うことが予定されているため、キャンペーン商品エンティティには同一のキャンペーン商品番号をもつ複数のレコードが存在しえます。よって、商品エンティティとキャンペーン商品エンティティの多重度は「1対多」です。したがって、空欄bには「→」が当てはまります。

b=→

【補足】
エンティティ間に関係がある場合、片方の主キー属性がもう片方の外部キー属性として存在します。キャンペーン商品エンティティの(複合)主キーは商品エンティティにはなく、逆に商品エンティティの主キーがキャンペーン商品エンティティにあるため、キャンペーン商品エンティティの「キャンペーン商品番号」属性が商品エンティティの主キーである「商品番号」属性を参照する外部キーであることが機械的にわかります。原則として、ある主キーをもつエンティティと、その主キーを外部キーに持つエンティティのカーディナリティ(多重度)は「1対多」です。

設問2

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

解答例・解答の要点

c:FROM
d:LEFT OUTER JOIN
e:SUM(M.商品個数 * S.商品原価)

解説

図2のSQL文について先に全体像を確認します。()で括られている部分に注目すると、以下の構造になっているとわかります。
pm06_6.png
副問合せによる表定義を含み複雑なものに見えますが、実際にはCK、UKの2つの表を結合(ON句)させ、その結果に対しSELECT文を実行しているだけに過ぎません。

【CKについて】
キャンペーン実施表から、指定したキャンペーン番号について、キャンペーン種別とその実施金額の一覧を得るものです。

【UKについて】
売上表、売上明細表、商品表を結合し、指定したキャンペーン番号について、キャンペーン種別とその合計売上、合計原価の一覧を得るものです。

cについて〕
主問合せのSELECT文の直後にあります。SELECT文の基本形は「SELECT 列名など FROM テーブル名」です。主問合せのSELECT文は、CKとUKの結合表を対象としますが、"SELECT"と対になる"FROM"がないので追加する必要があります。したがって、空欄cには「FROM」が入ります。

c=FROM

dについて〕
空欄はCKとUKの2つの表の間に位置すること、またON句で両表を結合することがわかっているので、空欄dには結合方法が入ります。すなわち、内部結合(INNER JOIN)、左外部結合(LEFT OUTER JOIN)、右外部結合(RIGHT OUTER JOIN)などのうち、どれが適切かを考えることになります。

主問合せのSELECT文を見ると、「売上計」や「原価計」がNULLの場合に0へ置き換えるためにCOALESCEが使われています。しかし、UKの副問合せ内だけを見れば、売上明細表の「商品個数」「商品単価」、商品テーブルの「商品原価」がNULLになることはありません。このことから、NULLが発生するのはCKとUKを結合した結果と判断できます。CKとUKとの内部結合であれば、売上計や原価計がNULLにはなり得ないため、この結合は外部結合が必要とわかります。

また、本文冒頭に「キャンペーンを定期的に実施してきたが,売上に全く結びつかないものもあった」とあるように、指定したキャンペーンの中には、特定のキャンペーン種別での売上が発生していないものも想定されます。その場合、売上テーブルには該当するレコードが1件も作られません。ここで内部結合にしてしまうと、売上ゼロのキャンペーン種別は結果から抜け落ちてしまい、実施したキャンペーンの実績を確認することができません。

たとえ売上が発生しなくても、キャンペーン実施表にはそのキャンペーン番号とキャンペーン種別の組が存在しています。売上がなかった種別に関する実績をも結果に出力するためには、実施したキャンペーン種別の一覧であるCKの行をすべて残す必要があり、このためには外部結合が必要です。CKは結合される側の表(左側)となるので、使うのは左外部結合です。したがって、空欄dには「LEFT OUTER JOIN」が入ります("OUTER"は省略可)。

d=LEFT OUTER JOIN

eについて〕
空欄の直後にAS 原価計があるので、空欄eには原価の合計を求める集計関数が入るとわかります。

空欄eの1つ上では、売上計を求めるのに「売上明細.商品個数と売上明細.商品単価の積」の合計(SUM)が使われています。これをヒントにすると、原価の合計も同様に「商品個数と商品原価の積」を合計すればよいと考えられます。商品個数は売上計と同じくM.商品個数、商品原価は商品表(別名S)にあるのでS.商品原価を使います。したがって、空欄eには「SUM(M.商品個数 * S.商品原価)」が当てはまります("M.","S."は省略可)。

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

設問3

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

解答例・解答の要点

f:AND U.キャンペーン種別 = 'H'
g:ORDER BY 売上実績数 DESC

解説

fについて〕
〔葉書を送る店舗エリアの見直し〕に、図3のSQL文での抽出対象について「❶対象の店舗における❷過去1年間に❸葉書キャンペーンで購入した会員」とあります。WHERE句ではU.店舗番号 = :店舗番号が❶、U.売上年月日 >= :一年前年月日が❷の要件に対応します。しかし、❸の条件は書かれていないため、空欄fには葉書キャンペーンに絞る条件式が入ります。

表1から、種別名が「葉書」に対応するキャンペーン種別は「H」であることが確認できます。SQL文に登場する2つのテーブル(売上、会員)のうち、キャンペーン種別列があるのは売上表(別名U)です。したがって、空欄fには「AND U.キャンペーン種別 = 'H'」が当てはまります("U."は省略可)。

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

gについて〕
空欄部はGROUP BY句の後に位置すること、SELECT文を見るとグループ化で指定が必要な列は「会員郵便番号」のみであることから、空欄gにはORDER BYかHAVINGのどちらかが来ると考えられます。

〔葉書を送る店舗エリアの見直し〕では「売上実績数の降順に出力する」ことが求められています。しかし、図3のSQL文にはこれを満たす文が存在しないため、空欄gにはこれを追加する必要があります。出力順を指定するのはORDER BY句です。

売上実績数はSELECT句で列名が付けられているので、その列名を指定できます。ORDER BY句では、昇順を指定する場合は"ASC"(省略可能)、降順を指定する場合は"DESC"を列名の直後につけます。したがって、空欄gには「ORDER BY 売上実績数 DESC」が当てはまります。

g=ORDER BY 売上実績数 DESC

設問4

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

解答例・解答の要点

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

解説

受けた指摘というのは「Webキャンペーン実績表は日次で実績を集計する想定になってしまっている」の部分です。

〔Webキャンペーン内容の定期的な見直しの検討〕からは、T社からのレポートからWebキャンペーン実績を作成するということが読み取れます。〔キャンペーンの概要〕には「T社からは,…実績を週次で集計したレポートが送付される」とあります。レポートは週次の集計単位なのに、それを記録する表が日次(実績年月日)で作られているのは矛盾しています。このため、表の構造を週次に合わせる対応が必要となります。したがって、答えは「Webキャンペーン実績表の集計粒度を日次から週次に修正する」です。

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

Pagetop