DBデータベーススペシャリスト試験 午後Ⅰ

平成24年度春期 データベーススペシャリスト 午後Ⅰ 問3

事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。

問題

問3 データウェアハウスの設計・運用に関する次の記述を読んで,設問1~3に答えよ。 コンビニエンスストアを全国で展開しているE社は,関係データベース管理システムを用いたデータウェアハウスを構築し,売上データを基に販売分析を行っている。データウェアハウスの設計・運用は,情報システム部のFさんが担当している。 〔組織及び販売商品の概要〕 1.組織 (1) 本部を頂点に,10支部で構成されている。 (2) 加盟店は全国で10、000店舗あり,1支部当たりの平均店舗数は1、000店である。 (3) 各支部の社員のうち,スーパバイザ(以下,SVという)として100人が各店舗の経営・運営を支援する。各SVは,所属する支部内の店舗を平均10店担当し,複数のSVが同時に同一店舗を担当することはない。 (4) 支部では,月の途中に支部内又は支部間の人事異動があり,SVの担当店舗を変えることがある。 2.販売商品 (1) 販売する商品は,全店舗共通である。 (2) 商品は,日配食品,加工食品,非食品に区分している。各商品区分は,次に示すように,更に商品分類として200種類に分類し,全商品点数は3、000点である。 ① 日配食品:毎日,配送センタから配送される弁当,生菓子など,80種類 ② 加工食品:カップ麺,レトルト食品,アルコール飲料など,80種類 ③ 非食品 :食品以外の雑誌,日用品,医薬品など,40種類 (3) 商品の商品区分は変えないが,商品分類は見直すことがある。 (4) 時期と店舗によって売れ筋商品は異なるが,全商品は毎日,各支部のいずれかの店舗で売れている。1店舗で,1日当たり平均2、000点,1か月当たり全商品点数3、000点が売れている。 〔テーブルの構造・保守及び販売分析〕 1.テーブル構造 販売分析に使用する主なテーブルの構造を図1に,主な列の意味を表1に示す。 図1のテーブルのうち,“店舗売上”テーブル以外を次元テーブルと呼ぶ。 図1 主なテーブルの構造 表1 主な列の意味 2.本部における処理 本部の情報システムは,各店舗から売上データファイルを収集し,販売分析に必要な処理を行う。 (1) 各店舗で前日に販売した全商品の店舗売上データファイル(売上日,店舗コード,商品コード,販売数,売上額を記録)を,毎晩0時に収集する。 (2) 販売分析に必要な変換処理と,売上日,店舗番号,商品番号別に集計した行を“店舗売上”テーブルに追加する処理を,6時までに行う。 3.テーブルの保守 (1) 日付,店舗,商品の三つを分析軸として販売分析を行う。これらの分析軸を表現する次元テーブルの各列値を,まれに変更することがある。 (2) 2011年7月1日,SVの青木さんと井上さんに支部間の人事異動があり,担当店舗を入れ替えた。そのために,当該店舗に新たに店舗番号を付与し,SVコードにそれぞれ新任SVの社員コードを設定した行を“店舗”テーブルに追加した。 (3) 最近,商品分類である生菓子を生洋菓子と生和菓子に分けた。図2,3の網掛け部分に示すように,商品コードを変えずに新たに商品分類番号と商品番号を付与した行を,それぞれ“商品分類”テーブルと“商品”テーブルに追加した。 図2 “商品分類”テーブルの例(一部) 図3 “商品”テーブルの例(一部) (4) 次元テーブルの変更後,“店舗売上”テーブルには最新の店舗番号及び商品番号を設定した行を追加するが,既に“店舗売上”テーブルに蓄積されている行を過去に遡って変更することはない。 4.販売分析 販売分析の例を表2に,対応する販売分析用SQL文を表3に示す。 表2 販売分析の例 表3 販売分析用SQL文(一部未完成) 表2中の分析A1を例に,販売分析の手順について説明する。 手順1 表3中のSQLA1を実行し,その結果行をCSVファイルに出力する。 手順2 表計算ソフトに手順1のCSVファイルを入力し,表4に示すように支部名,社員コード,社員名,四半期別SV別売上額を並べる。表4の網掛け部分の支部別SV別年間売上額,支部別年間売上額,全社年間売上額は,表計算ソフトの機能を利用して計算する。 表4 2011年四半期別SV別支部別全社売上額 5.サマリテーブル “店舗売上”テーブルへの1日当たりの入力件数は,2、000万件に達する。経営部門及び現場のSVからは,いろいろな切り口で迅速に分析したいという要望が出ている。現状では,“店舗売上”テーブルからその都度,集計していると,時間が掛かってしまう。そこでFさんは,図4に示すサマリテーブルを用意した。そして,表5に示す手順でサマリテーブルを毎日更新し,サマリテーブルからその都度,表2中の分析B1~B4の売上額を計算することにした。 なお,サマリテーブルには,売上額がゼロの行は存在しないものとする。 図4 サマリテーブルの構造 表5 サマリテーブルを更新する手順 〔問題点の指摘〕 Fさんの上司であるG氏は,次のように問題点を指摘した。 ① 青木さんと井上さんの人事異動前後の売上実績が,表4の年間売上額に正しく反映されていない。今後,人事異動の時期にかかわらず,同じような問題が起きないようにすべきである。 ② 表5の手順では,次元テーブルの列値の変更の有無にかかわらず,特定日を除き,SQL文で正しく更新できないサマリテーブルがある。 ③ 2012年4月15日に,商品分類である生菓子を生洋菓子と生和菓子に分けたが,表2中の分析B1~B4のうち,“店舗売上”テーブルから再集計をしないと,この最新の商品分類を反映できない分析がある。 設問1 表3の販売分析用SQL文について,(1)~(3)に答えよ。 (1) 表3中の[a]~[c]に入れる適切な字句を答えよ。 (2) 表3中のSQLA2において,内結合でなく外結合を使う理由を,本文中の用語を用いて,25字以内で述べよ。 (3) 表3中の[d],[e]に入れる適切な字句を答えよ。 設問2 〔問題点の指摘〕の①への対応について,(1),(2)に答えよ。 (1) 表4中の支部別SV別年間売上額,支部別年間売上額,全社年間売上額のうち,正しくないものを全て答えよ。また,人事異動前後の売上実績がそれらの年間売上額に正しく反映されなかった理由を,30字以内で述べよ。 (2) 〔問題点の指摘〕の①への対応として,Fさんは,変更履歴を残すために,“SV社員”テーブルと“店舗”テーブルの構造を次のように変更し,併せてSQLA1を見直した。この対応後に支部間の人事異動によってSVの担当店舗が変わった場合,その変更を“SV社員”テーブルに対してどのように反映すべきかを,30字以内で述べよ。 SV社員(SV番号,社員コード,社員名,支部コード,支部名,着任日) 主キー:SV番号 店舗(店舗番号,店舗コード,店舗名,SV番号,登録日) 主キー:店舗番号 外部キー:SV番号 設問3 〔問題点の指摘〕の①への対応が済んでいることを前提に,〔問題点の指摘〕の②,③への対応について,(1)~(3)に答えよ。 (1) サマリテーブルS1~S4のうち,〔問題点の指摘〕の②に該当するものを一つ選び,特定日の例を一つ答えよ。また,その特定日を除き,SQL文で正しく更新できない理由を,20字以内で述べよ。 (2) (1)の問題が解決していることを前提に,表2中の分析B1,B2の売上額を集計できるサマリテーブルの名称を,それぞれGROUP BY句による年間の集計対象行数が少ない順に,全て答えよ。 なお,一つのサマリテーブルから売上額を集計するものとし,必要に応じて次元テーブルを参照するものとする。 (3) 分析B1~B4のうち,〔問題点の指摘〕の③に該当するものを,全て答えよ。
図1 主なテーブルの構造。枠で囲んだ関係スキーマ。SV社員,店舗,商品分類,商品,日付,店舗売上の6テーブルの属性を列挙し,主キーを実線の下線,外部キー(SVコード,商品分類番号)を破線の下線で示している。
図1 主なテーブルの構造。枠で囲んだ関係スキーマ。SV社員,店舗,商品分類,商品,日付,店舗売上の6テーブルの属性を列挙し,主キーを実線の下線,外部キー(SVコード,商品分類番号)を破線の下線で示している。
表1 主な列の意味。社員コード,支部コード,着任日,店舗番号,店舗コード,SVコード,商品番号,商品コード,日付,年・月・日,登録日の意味を説明する表。店舗番号と商品番号は,変更履歴を残すために列値変更時に新たに付与する番号。注記として,付与する番号・コードは再利用しない。
表1 主な列の意味。社員コード,支部コード,着任日,店舗番号,店舗コード,SVコード,商品番号,商品コード,日付,年・月・日,登録日の意味を説明する表。店舗番号と商品番号は,変更履歴を残すために列値変更時に新たに付与する番号。注記として,付与する番号・コードは再利用しない。
図2 “商品分類”テーブルの例(一部)。商品分類番号14の生菓子(2009-01-01登録)と,網掛けで示した新規行201生洋菓子,202生和菓子(いずれも日配食品,2012-04-15登録)の3行を示す表。
図2 “商品分類”テーブルの例(一部)。商品分類番号14の生菓子(2009-01-01登録)と,網掛けで示した新規行201生洋菓子,202生和菓子(いずれも日配食品,2012-04-15登録)の3行を示す表。
図3 “商品”テーブルの例(一部)。商品番号1007/1008(P007紅茶ケーキ,P008抹茶あずき,分類14,2009-01-01)と,網掛けで示した新規行3001/3002(分類201/202,2012-04-15)の4行を示す表。単価は240と270。
図3 “商品”テーブルの例(一部)。商品番号1007/1008(P007紅茶ケーキ,P008抹茶あずき,分類14,2009-01-01)と,網掛けで示した新規行3001/3002(分類201/202,2012-04-15)の4行を示す表。単価は240と270。
表2 販売分析の例。分析名,SQL,分析の内容の表。分析A1~A3はSQLA1~A3に対応(四半期別SV別支部別全社売上額,M001とM002の販売数一覧,最新商品分類に基づく日別売上額)。分析B1~B4(SQLは省略)は2009年以降の年別・月別の各種売上額。
表2 販売分析の例。分析名,SQL,分析の内容の表。分析A1~A3はSQLA1~A3に対応(四半期別SV別支部別全社売上額,M001とM002の販売数一覧,最新商品分類に基づく日別売上額)。分析B1~B4(SQLは省略)は2009年以降の年別・月別の各種売上額。
表3 販売分析用SQL文(一部未完成)。SQLA1~SQLA3のSQL構文を示す表。SQLA2には外結合の種類を表す空欄aと,WHERE句の空欄b・c,SQLA3には相関副問合せの空欄d・eがある。注記では,ISODATE関数は日付文字列をDATE型に変換するユーザ定義関数とする。
表3 販売分析用SQL文(一部未完成)。SQLA1~SQLA3のSQL構文を示す表。SQLA2には外結合の種類を表す空欄aと,WHERE句の空欄b・c,SQLA3には相関副問合せの空欄d・eがある。注記では,ISODATE関数は日付文字列をDATE型に変換するユーザ定義関数とする。
表4 2011年四半期別SV別支部別全社売上額。単位は億円。支部名,社員コード,社員名,1~4期の売上額と,網掛けの支部別SV別年間売上額,支部別年間売上額,全社年間売上額を並べた表。支部Aには青木・加藤,支部Bには井上・渡辺が並ぶ。注記として各期の月範囲を示す。
表4 2011年四半期別SV別支部別全社売上額。単位は億円。支部名,社員コード,社員名,1~4期の売上額と,網掛けの支部別SV別年間売上額,支部別年間売上額,全社年間売上額を並べた表。支部Aには青木・加藤,支部Bには井上・渡辺が並ぶ。注記として各期の月範囲を示す。
図4 サマリテーブルの構造。サマリテーブルS1~S4の関係スキーマを示す図。年,月,日,四半期名,店舗コード,支部コード,商品分類番号,商品コード,社員コードなどの組合せを主キー(下線)とし,名称列と売上額を持つ。
図4 サマリテーブルの構造。サマリテーブルS1~S4の関係スキーマを示す図。年,月,日,四半期名,店舗コード,支部コード,商品分類番号,商品コード,社員コードなどの組合せを主キー(下線)とし,名称列と売上額を持つ。
表5 サマリテーブルを更新する手順。手順IではSELECT文で“店舗売上”テーブルから前日の行だけを選択し,GROUP BY句で集計した結果行をCSVファイルに出力する。手順IIではINSERT文で,そのCSVファイルの全レコードをサマリテーブルに追加する。
表5 サマリテーブルを更新する手順。手順IではSELECT文で“店舗売上”テーブルから前日の行だけを選択し,GROUP BY句で集計した結果行をCSVファイルに出力する。手順IIではINSERT文で,そのCSVファイルの全レコードをサマリテーブルに追加する。
解き方のヒントを見る

時点の整合から設計を検討する

次元の属性が変わったとき、集計結果がどの時点の状態に基づくべきかという要求を先に確認しましょう。その要求と履歴の持ち方、サマリの更新範囲がそろっているかという一つの観点で読み解きます。

この問題で問われていること

問われているのは個々の用語の暗記よりも、業務上の分析要求と、データの保持方法や更新手順との対応関係です。記述されている要求がどの時点の状態を基準に集計したいのかを読み取り、設計上の課題と結び付けて考えることが中心です。

視点

データウェアハウスでは、分析の軸となる情報が時間とともに変化し得ます。事実データ、軸となる情報、あらかじめ集計した結果は、それぞれ異なるタイミングで作られます。そのため、ある時点で見た集計が別の時点の状態と食い違うことがあります。設計を検討するときは、利用者がどの時点の見え方を求めているかを基準にします。そのうえで、保持と再集計の方針が一貫しているかを確かめると整理しやすくなります。

確認ポイント

  • 分析者が求めている集計が、どの時点の状態を基準にしているかを読み取れたか
  • 軸となる情報の変化が、既存の集計結果にどの範囲まで影響し得るかを考えたか
  • 保持の方針と集計の更新手順が、読み取った要求と矛盾していないかを確かめたか
正解と解説を見る

解説

コンビニチェーンのデータウェアハウスを題材に、スタースキーマの次元テーブルとサロゲートキーによる変更履歴の管理、外結合・相関副問合せを使ったSQL、日次更新するサマリテーブルの主キー設計と集計の単位を問う問題です。公式解答例では、LEFT外結合と販売数IS NOT NULLの条件、商品コードによる相関副問合せ、SV番号を新しく付けた行の追加、四半期・月単位のサマリ(S2・S4)で起きる主キーの重複、B2に使えるサマリの行数順S3・S4・S2、再集計が必要なB3、が答えとされています。

問題の全体像

E社は全国10、000店舗(10支部、1支部1、000店)の売上を“店舗売上”テーブル(ファクト)と、日付・店舗・商品などの次元テーブルからなるスタースキーマで管理しています。店舗・商品の列の値が変わったときは、新しい店舗番号・商品番号(サロゲートキー)を付けた行を追加し、過去の売上行は更新しない運用です。一方、SV社員テーブルは社員コードが主キーのままなので、人事異動の履歴を残せません。さらに日次更新のサマリテーブルS1~S4には、主キーの設計と集計の単位に問題があります。公式解答例の出題趣旨では、スタースキーマと次元テーブルの役割、サロゲートキーの役割と考慮点、サマリテーブル(データマート)の設計・運用、外結合と相関副問合せの理解が問われているとされています。

設問1(1)(a)

分析A2は「M001とM002の少なくともどちらか一方で売れた商品」の一覧です。SQLA2は“商品”Pを基準に、店舗ごとの売上U1・U2を順に結合しています。売れなかった店舗の側がNULLになっても商品の行を残すには、左側の商品表を基準にする外結合が必要です。そのため公式解答例では、aはLEFT(LEFT OUTER JOIN)とされています。売上日と店舗コードの条件をWHERE句でなくON句に書いているのも、外結合で行を残すための書き方です。

設問1(1)(b)

LEFT外結合だけでは、どちらの店舗でも売れなかった商品も、U1・U2の両方がNULLの行として結果に残ります。そこでWHERE句で「どちらか一方で売れた」行だけに絞り込みます。公式解答例では、bはU1.販売数 IS NOT NULL(またはU1.販売数>0)とされ、cとは順不同です。M001で売れた商品だけが残る条件です。

設問1(1)(c)

bと対になる条件です。公式解答例では、cはU2.販売数 IS NOT NULL(またはU2.販売数>0)とされています(bとは順不同)。bとcをORでつなぐと、少なくとも一方の店舗で売れた商品だけが残り、分析A2の要件を満たします。

設問1(2)

着目点は〔組織及び販売商品の概要〕2.(4)の「時期と店舗によって売れ筋商品は異なる」という記述です。内結合にすると、M001とM002の両方で売れた商品しか残らず、一方の店舗だけで売れた商品が抜け落ちます。公式解答例では「時期と店舗によって売れ筋商品は異なるから」「店舗によって全商品が売れるとは限らないから」とされています。25字以内に収めるには、本文の用語を使って「店舗によって売れる商品が異なる」ことを示せば十分です。

設問1(3)(d)

分析A3は「最新の商品分類」による集計です。“商品”テーブルには同じ商品コードで商品番号の違う行が複数あるため(図3)、商品コードごとに登録日が最大の行を相関副問合せで選びます。副問合せの内側P2を、外側の商品(P1、またはU)と商品コードで対応付けます。公式解答例では、dはP1.商品コード(またはU.商品コード)とされ、eとは順不同です。採点講評では、ここを商品番号とする誤りが目立ったと指摘されています。外側のWHERE句にあるU.商品コード=P1.商品コードと、表1の商品コード・商品番号の意味の違いが手掛かりです。

設問1(3)(e)

dと対になる、副問合せ側の列です。公式解答例では、eはP2.商品コードとされています。P2.商品コード=P1.商品コードとすると、同じ商品コードを持つ全行のうち最大の登録日、つまり最新の分類を持つ行だけがP1として選ばれます。店舗売上Uとは商品コードで結合しているので、過去の売上も最新の商品分類で集計されます。

設問2(1)(正しくないもの)

SQLA1は店舗→SVコード→SV社員と結合し、V.支部名で分類しています。店舗テーブルは異動時に新しい店舗番号で行を追加するので、各売上がどのSVのものかは正しく分かります。しかしSV社員テーブルは社員コードが主キーで、支部を1つしか保持できません。そのため、青木さん・井上さんの異動前後の売上が、すべて一つの支部(分析時点の所属支部)に計上されます。公式解答例では、正しくないものは支部別SV別年間売上額と支部別年間売上額とされています。全社年間売上額は支部の振り分けに関係なく合計が変わらないので、正しいままです。

設問2(1)(理由)

理由として押さえる要素は「SV社員テーブルが異動前の支部を保持していない(上書きされる)」ことと、「その結果、分析時点の支部で集計される」ことです。公式解答例では「社員が人事異動前に所属していた支部の情報を失うから」「SVの売上額が分析実施時点の所属支部に集計されるから」とされています。30字以内なので、どちらか一方の観点を簡潔に書けば足ります。

設問2(2)

変更後のSV社員テーブルは、サロゲートキーのSV番号が主キーで、店舗テーブルはSV番号を外部キーとして参照します。店舗番号・商品番号と同じ考え方で、支部が変わったときは既存行を更新せず、新しいSV番号を付けた行を追加します。そうすれば過去の店舗行は旧SV番号(旧支部)を、新しい店舗行は新SV番号(新支部)を参照し、異動前後の支部別売上が正しく分かれます。公式解答例では「当該社員に新しいSV番号を付与した行を追加する」「当該社員に異動後の支部コードを設定した行を追加する」とされています。

設問3(1)(サマリテーブル名)

表5の手順では、毎日「前日分」をGROUP BYで集計し、INSERTでサマリに追加します。主キーに日を含むS1・S3は毎日別の行になるので問題ありません。一方、S2の主キーは(年、四半期名、店舗コード、商品コード)、S4は(年、月、商品コード、社員コード)で、日単位より粗い単位です。そのため、同じ期間の2日目以降は同じ主キーの行を再びINSERTすることになります。採点講評でも、INSERT文を使うことと各サマリテーブルの主キーに着目してほしかったと述べられています。公式解答例では、S2またはS4とされています。

設問3(1)(特定日の例)

INSERTが正しく行えるのは、その集計単位の最初の日のデータを追加する日だけです(その時点ではまだ行が存在しないため)。公式解答例では、S2を選んだ場合は「四半期の初日」、S4を選んだ場合は「各月の初日」とされています。選んだサマリテーブルと特定日の組合せを取り違えないように注意が必要です。

設問3(1)(理由)

特定日以外は、同じ年・四半期(または月)・店舗(または社員)・商品の行がすでにサマリに入っています。そのため、INSERTしようとすると主キー制約に違反します。本来は既存行の売上額を加算するUPDATEが必要です。公式解答例では「主キーが重複するから」「挿入すべき行が既に存在するから」とされています。20字以内なので、主キーの重複という一点を書けば足ります。

設問3(2)(B1)

B1は年別・月別・店舗名別・商品区分名別の分析です。月と店舗の単位を持ち、商品区分へたどれるサマリが必要です。S1は日・店舗コード・商品分類番号を持ち、商品分類テーブルを参照すれば商品区分名が得られるので、集計できます。S2は四半期単位で月が分からず、S3は支部単位、S4は社員(SV)単位で店舗が分かりません。採点講評のとおり、各サマリの次元の単位と分析したい単位を比べると、公式解答例のとおりS1だけになります。

設問3(2)(B2)

B2は年別・商品名別の分析です。商品名(商品コード)を持つS2・S3・S4が使え、商品分類単位のS1は使えません。採点講評に従い、商品コード以外の次元で年間の行数を見積もります。全商品3、000点は毎日各支部のいずれかの店舗で売れ、1店舗でも1か月で全商品が売れるので、各キー組合せにはほぼ行があると考えます。S3は365日×10支部×3、000点で約1、095万行です。S4は、SVが1支部当たり100人(1、000店÷10店)なので全社1、000人となり、12か月×1、000人×3、000点で3、600万行です。S2は4四半期×10、000店×3、000点で1億2、000万行です。したがって公式解答例のとおり、少ない順にS3、S4、S2となります。SVを全社100人と読み違えると順序を誤る点に注意が必要です。

設問3(3)

生菓子を生洋菓子・生和菓子に分けても、商品区分名(日配食品)と商品名は変わりません。そのためB1とB2は影響を受けません。B4(支部別・月別・商品分類名別)はS3から集計でき、S3は商品コードを持つので、商品テーブルの最新の行をたどれば新しい分類で集計できます。B3(店舗別・月別・商品分類名別)は店舗と月の単位を持つS1からしか集計できません。しかしS1には過去分が旧分類(商品分類番号14)で集計済みなので、生洋菓子と生和菓子に分け直せず、店舗売上からの再集計が必要です。採点講評の考え方どおり、公式解答例ではB3とされています。

学習のポイント

商品番号(行ごとの番号)と商品コード(商品ごとの識別子)のように、サロゲートキーと業務上の識別子の違いを理解すること。また、サマリテーブルの主キーから集計の単位と年間の行数を見積もる手順を身に付けることが重要です。

出典:独立行政法人 情報処理推進機構(IPA)平成24年度春期 データベーススペシャリスト試験 午後Ⅰ 問3(公式資料:問題冊子(PDF) / 解答例 / 採点講評)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針