ホーム > データベーススペシャリスト試験 > 2012年
データベーススペシャリスト試験 2012年 午後1 問03
データウェアハウスの設計・運用に関する次の記述を読んで, 設問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のテーブルのうち, “店舗売上” テーブル以外を次元テーブルと呼ぶ。


2.本部における処理
本部の情報システムは,各店舗から売上データファイルを収集し,販売分析に必要な処理を行う。
(1) 各店舗で前日に販売した全商品の店舗売上データファイル(売上日,店舗コード,商品コード, 販売数, 売上額を記録)を,毎晩0時に収集する。
(2) 販売分析に必要な変換処理と,売上日,店舗番号,商品番号別に集計した行を “店舗売上”テーブルに追加する処理を, 6時までに行う。
3.テーブルの保守
(1) 日付,店舗, 商品の三つを分析軸として販売分析を行う。これらの分析軸を表現する次元テーブルの各列値を, まれに変更することがある。
(2) 2011年7月1日, SV の青木さんと井上さんに支部間の人事異動があり,担当店舗を入れ替えた。 そのために,当該店舗に新たに店舗番号を付与し, SV コードにそれぞれ新任 SV の社員コードを設定した行を “店舗” テーブルに追加した。
(3) 最近,商品分類である生菓子を生洋菓子と生和菓子に分けた。図 2,3 の網掛け部分に示すように,商品コードを変えずに新たに商品分類番号と商品番号を付与した行を,それぞれ “商品分類” テーブルと“商品”テーブルに追加した。


(4) 次元テーブルの変更後,“店舗売上” テーブルには最新の店舗番号及び商品番号を設定した行を追加するが,既に“店舗売上” テーブルに蓄積されている行を過去に遡って変更することはない。
4.販売分析
販売分析の例を表2に, 対応する販売分析用 SQL文を表3 に示す。


表2中の分析 A1 を例に、販売分析の手順について説明する。
手順1 表3中の SQLA1 を実行し、その結果行をCSV ファイルに出力する。
手順2 表計算ソフトに手順1のCSV ファイルを入力し, 表4 に示すように支部名,
社員コード,社員名, 四半期別 SV 別売上額を並べる。 表4の網掛け部分の支部別 SV 別年間売上額,支部別年間売上額,全社年間売上額は, 表計算ソフトの機能を利用して計算する。

5.サマリテーブル
“店舗売上” テーブルへの1日当たりの入力件数は, 2,000万件に達する。経営部門及び現場の SV からは,いろいろな切り口で迅速に分析したいという要望が出ている。現状では,“店舗売上”テーブルからその都度, 集計していると,時間が掛かってしまう。そこでF さんは,図4に示すサマリテーブルを用意した。 そして 表5 に示す手順でサマリテーブルを毎日更新し,サマリテーブルからその都度, 表 2中の分析 B1〜B4の売上額を計算することにした。
なお,サマリテーブルには,売上額がゼロの行は存在しないものとする。


〔問題点の指摘〕
Fさんの上司であるG氏は,次のように問題点を指摘した。
① 青木さんと井上さんの人事異動前後の売上実績が,表4の年間売上額に正しく反映されていない。今後,人事異動の時期にかかわらず,同じような問題が起きないようにすべきである。
② 表5の手順では,次元テーブルの列値の変更の有無にかかわらず,特定日を除き, SQL文で正しく更新できないサマリテーブルがある。
③2012年4月15日に,商品分類である生菓子を生洋菓子と生和菓子に分けたが,表2中の分析 B1〜B4 のうち, “店舗売上” テーブルから再集計をしないと, この最新の商品分類を反映できない分析がある。
設問1(1):表3の販売分析用 SQL文について,(1)〜(3)に答えよ。
表3中の(a)〜(c)に入れる適切な字句を答えよ。(b, cは順不同)
模範解答
a:LEFT
b:U1.販売数 IS NOT NULL 又は U1.販売数>0
c:U2.販売数 IS NOT NULL 又は U2.販売数>0
解説
コアとなるキーワードと論点整理
解答が (a),(b),(c) になる理由
-
「少なくともどちらか一方の店舗で売れた商品」を抽出する要件
問題文より「店舗コードM001とM002の店舗において、2011年4月1日に少なくともどちらか一方の店舗で売れた商品の商品名及び販売数一覧」
とあるため、- 「P(全商品)を起点に、M001 店と M002 店の売上を結合」
- どちらか一方の売上があればよい
という条件を満たす必要があります。
-
OUTER JOIN の使いどころ
- INNER JOIN にすると 両店舗で売れた商品 のみが抽出されてしまい要件を満たさない
- LEFT OUTER JOIN で P を基準に結合し、売れなかった側は NULL として取り込む
-
WHERE 句の絞り込み
- OUTER JOIN した場合、売上がない行は U1.販売数/U2.販売数 が NULL
- 「売れた」を判定するには
IS NOT NULL
(または> 0
)でチェック - 少なくともどちらかの店舗で売れた=
U1.販売数 IS NOT NULL OR U2.販売数 IS NOT NULL
SQLA2 の仕上がりイメージ
SELECT
P.商品名,
U1.販売数,
U2.販売数
FROM 商品 P
LEFT OUTER JOIN 店舗売上 U1
ON P.商品番号 = U1.商品番号
AND U1.売上日 = ISODATE('2011-04-01')
AND U1.店舗コード = 'M001'
LEFT OUTER JOIN 店舗売上 U2
ON P.商品番号 = U2.商品番号
AND U2.売上日 = ISODATE('2011-04-01')
AND U2.店舗コード = 'M002'
WHERE
U1.販売数 IS NOT NULL -- (b)
OR U2.販売数 IS NOT NULL -- (c)
;
(a)
に入るのはLEFT
(b)
に入るのはU1.販売数 IS NOT NULL
(またはU1.販売数 > 0
)(c)
に入るのはU2.販売数 IS NOT NULL
(またはU2.販売数 > 0
)
受験者が誤りやすいポイント
- INNER JOIN を選んでしまう
- 両店舗で売れた商品だけ抽出され要件に合わない
- WHERE 句で
U1.販売数 > 0
とU2.販売数 > 0
を AND で結ぶ- 「どちらか一方」ではなく「両方売れたもの」だけが残る
- NULL チェックの理解不足
- OUTER JOIN 後の NULL 値を利用して売上の有無を判定する点を押さえていない
試験対策として押さえるべき知識
- JOIN の種類
- INNER JOIN:両側にマッチする行のみ
- LEFT OUTER JOIN:左側を全て、右側はマッチなしを NULL で補填
- RIGHT/FULL も理解しておく
- NULL の扱い
- NULL と比較演算子(
=
や>
)は常に FALSE IS NULL
/IS NOT NULL
を用いた判定
- NULL と比較演算子(
- 要件のキーワード
- 「少なくともどちらか一方」→ OR 条件+OUTER JOIN
- 「両方」→ AND 条件+INNER JOIN
以上を理解し、「結合方法」と「NULL チェック」を組み合わせる問題パターンを確実に正答できるようにしましょう。
設問1(2):表3の販売分析用 SQL文について,(1)〜(3)に答えよ。
表3中の SQLA2 において,内結合でなく外結合を使う理由を,本文中の用語を用いて, 25字以内で述べよ。
模範解答
・時期と店舗によって売れ筋商品は異なるから
・店舗によって全商品が売れるとは限らないから
解説
キーワード整理
- 外結合(OUTER JOIN)
- 売上がない商品も結果に含める
- 特定店舗で売れない商品の扱い
解答の論理的説明
SQLA2では,商品マスタ(P)に対して当該日の各店舗売上(U1,U2)を結合しています。
もし内結合(INNER JOIN)を使うと,ある店舗で売れなかった商品は結合結果から除外され,商品名一覧に抜けが生じます。
問題文には
もし内結合(INNER JOIN)を使うと,ある店舗で売れなかった商品は結合結果から除外され,商品名一覧に抜けが生じます。
問題文には
「時期と店舗によって売れ筋商品は異なるが,全商品は毎日, 各支部のいずれかの店舗で売れている。」
とあるため,特定の店舗で売れなかった商品も表示させるには外結合が必要です。
誤りやすいポイント
- WHERE句に結合条件を書く
外結合で取得したNULL行にWHERE U1.販売数>0
などを置くと,内部結合と同様にNULL行が除外される - NULLの扱い
販売数がNULL=売上ゼロの扱いとして明示的にCOALESCE
などで0に変換する
試験対策ポイント
- 内結合は「両側に存在する行のみ」返す
- 左外結合は「左側の全行+右側にマッチしなければNULL」
- WHERE句でNULLフィルタリングしないよう注意する
- 「売れ筋商品は店舗‐時期で異なる」「全商品が各店で売れるわけではない」→外結合の要件を即答できるようにする
設問1(3):表3の販売分析用 SQL文について,(1)〜(3)に答えよ。
表3中の(d),(e)に入れる適切な字句を答えよ。(d, eは順不同)
模範解答
d:P1.商品コード 又は U.商品コード
e:P2.商品コード
解説
解説の概要
SQLA3のサブクエリ部分
… P1.登録日 = (
SELECT MAX(P2.登録日)
FROM 商品 P2
WHERE d = e
)
において、「同一の商品(ナチュラルキーとしての商品コード)」の最新の
登録日
を取得するために、商品コード
で外側クエリ(P1またはU)と内側クエリ(P2)を結び付ける必要があります。キーワード・論点整理
- 履歴管理(バージョニング)
「商品番号」は行を一意に識別するサロゲートキー
「商品コード」は属性変更後も不変のナチュラルキー - 最新バージョンの抽出
MAX(登録日)
を相関サブクエリで取得 - 相関サブクエリ
外側のエイリアス(P1またはU)と内側のエイリアス(P2)を結合
解答のポイント
表3中のSQLA3では、以下の記述があります。
… P1.登録日 =
(SELECT MAX(P2.登録日) FROM 商品 P2 WHERE <d> = <e>)
ここで
- 内側クエリのテーブルは
商品 P2
- 外側クエリで紐づけるテーブルとして
商品 P1
または店舗売上 U
を利用できます。
したがって、正しくは
WHERE P2.商品コード = P1.商品コード
(あるいは
と記述し、同一商品コードの中で最新の登録日を取得します。
P1.商品コード = P2.商品コード
)と記述し、同一商品コードの中で最新の登録日を取得します。
【模範解答】
- d:P1.商品コード (※外側エイリアスU.商品コードも可)
- e:P2.商品コード
なぜその解答になるのか
問題文には次の記述があります。
「商品を登録したときに付与する。また、商品の列値を変更したときに、変更履歴を残すために、
その商品に新たに商品番号を付与し、変更後の列値を設定した行を “商品” テーブルに追加する。」
つまり、同じ論理的商品は商品コードで識別し、新旧行は登録日で履歴管理されています。
最新行を得るためには、同じ商品コード同士を比較し、その中で
最新行を得るためには、同じ商品コード同士を比較し、その中で
MAX(登録日)
を取得する必要があります。受験者の誤りやすいポイント
- 「商品番号」をキーにしてしまう
→ 商品番号は行ごとに再付与されるサロゲートキーのため、履歴取得には不向き - 相関サブクエリで外側参照を忘れる
→WHERE P2.登録日=(SELECT MAX(P2.登録日)… )
のように相関がずれる U.商品コード
でも外側参照は可能だが、設問がP1を想定
試験対策として覚えておくべきポイント
- サロゲートキー(商品番号)とナチュラルキー(商品コード)の役割を区別
- バージョニングされたテーブルから「最新行」を取得するには
- 相関サブクエリ+
MAX(登録日)
WHERE <ナチュラルキー>=<サブクエリ側のナチュラルキー>
- 相関サブクエリ+
- 相関サブクエリでは、外側のエイリアス名を正しく指定する
- データウェアハウス/履歴管理設計の基本を押さえる
- 次元テーブルの履歴管理は “過去へさかのぼって更新しない”(SCD Type 2 相当)
以上を理解しておくと、同様の「最新バージョン取得」要求に対応できます。
設問2(1):〔問題点の指摘〕 の① への対応について,(1),(2)に答えよ。
表4中の支部別 SV 別年間売上額,支部別年間売上額,全社年間売上額のうち、正しくないものを全て答えよ。また,人事異動前後の売上実績がそれらの年間売上額に正しく反映されなかった理由を, 30字以内で述べよ。
模範解答
正しくないもの:支部別 SV別年間売上額,支部別年間売上額
理由:・社員が人事異動前に所属していた支部の情報を失うから
・SVの売上額が分析実施時点の所属支部に集計されるから
解説
模範解答の論点整理
-
正しくないもの
- 支部別 SV別年間売上額
- 支部別年間売上額
-
正しいもの
- 全社年間売上額
-
理由(30字以内)
社員が人事異動前に所属していた支部の情報を失うから
SVの売上額が分析実施時点の所属支部に集計されるから
解答の論理的説明
-
問題文の該当箇所
- 「(2) 2011年7月1日, SV の青木さんと井上さんに支部間の人事異動があり, 担当店舗を入れ替えた。」
- 「(4) 次元テーブルの変更後, “店舗売上” テーブルには最新の店舗番号及び商品番号を設定した行を追加するが, 既に“店舗売上” テーブルに蓄積されている行を過去に遡って変更することはない。」
-
なぜ「支部別 SV別年間売上額」「支部別年間売上額」が誤るのか
- 人事異動によって「SVコード」が変わった後も、過去分の“店舗売上” は更新されないため、
- SQLA1 の結合条件
により、過去日の売上実績も分析実施時点の(最新の)SVコード・支部コードと結合される。… WHERE U.店舗番号 = M.店舗番号 AND M.SVコード = V.社員コード …
- その結果、移動前に支店Aで獲得した売上が支店Bの実績に反映されてしまい、
支部別・SV別の年間集計が正しくならない。
-
なぜ「全社年間売上額」は正しいのか
- 全社合計は、部門やSVを意識せず単に全売上額を合算するだけなので、
- 次元テーブルの変更(SV異動など)に影響されず、全社の売上額合計は変わらない。
受験者が誤りやすいポイント
-
「過去行は更新しない」がキモ
- データウェアハウスで履歴管理(Type2次元)を利用している場合、
変更後に既存売上を更新しない設計が多い点を押さえること。
- データウェアハウスで履歴管理(Type2次元)を利用している場合、
-
全社合計もズレると思い込みやすい
- 支部やSVコードとは無関係に集計するため、全社合計だけは常に正しい。
-
「登録日」の考慮漏れ
- SQLA1 では「登録日」を考慮せず結合しているため、最新次元としか結合できない点を理解する。
試験対策としてのポイント
- 次元テーブル変更時の売上テーブルへの影響
- 変更前の売上実績をそのまま残し、結合時に履歴を正しく参照する手法(有効開始日/終了日など)を理解する。
- データウェアハウスの Slowly Changing Dimension(SCD)
- 種類(Type1~4)ごとの特徴と、照会時に履歴を参照する方法を押さえる。
- 分析SQLの結合条件チェック
- 履歴管理項目(登録日や有効開始日)を必ず WHERE 句やサブクエリで制限し、意図しない次元行と結合しないようにする。
設問2(2):〔問題点の指摘〕 の① への対応について,(1),(2)に答えよ。
〔問題点の指摘〕 の① への対応として, F さんは,変更履歴を残すために,“SV 社員” テーブルと “店舗” テーブルの構造を次のように変更し、併せてSQLA1 を見直した。 この対応後に支部間の人事異動によって SV の担当店舗が変わった場合,その変更を “SV 社員” テーブルに対してどのように反映すべきかを, 30字以内で述べよ。
SV社員(SV番号,社員コード, 社員名, 支部コード, 支部名,着任日)
店舗(店舗番号,店舗コード,店舗名,SV 番号,登録日)
模範解答
・当該社員に新しい SV番号を付与した行を追加する。
・当該社員に異動後の支部コードを設定した行を追加する。
解説
キーワード・論点整理
- 履歴管理(変更履歴を残す)
- サロゲートキー(SV番号)
- SCD(スローリー・チェンジング・ディメンション)タイプ2
解答の骨子
「当該社員に新しい SV番号を付与した行を追加する」
→ SV番号をサロゲートキーとして用い、既存行を更新せずに「新規行の挿入」で異動後の支部コードと着任日を登録する
→ SV番号をサロゲートキーとして用い、既存行を更新せずに「新規行の挿入」で異動後の支部コードと着任日を登録する
解答に至る理由
問題文では次のように示されています。
変更履歴を残すために,“SV 社員” テーブルと “店舗” テーブルの構造を次のように変更し...
SV社員(SV番号, 社員コード, 社員名, 支部コード, 支部名, 着任日)
注記 付与する番号又はコードは、再利用しない。
- 「変更履歴を残す」とある以上、既存レコードを上書き(UPDATE)してはいけません。
- SV番号はサロゲートキーであり、一意な新番号を付与して新規行を追加すると、前職と現職の履歴を区別して保持できます。
- 追加行には「異動後の支部コード」と「着任日」を設定します。
受験者が誤りやすいポイント
試験対策ポイント
- 「変更履歴を残す」=SCDタイプ2:古いレコードは維持し、新規レコードをINSERT
- サロゲートキー(SV番号や店舗番号、商品番号など)をキーに、履歴管理を行う
- 主キーやコードを「再利用しない」方針を厳守
- UPDATEではなくINSERTで対応するケースを押さえる
- テーブルトライアングル問題(図や文中のテーブル構造)で、どの列がキーかを確認する癖をつける
以上を踏まえ、「SV社員テーブルに新SV番号の行をINSERTし、異動後支部コードと着任日を設定する」ことが正答に不可欠です。
設問3(1):〔問題点の指摘〕 の ① への対応が済んでいることを前提に,〔問題点の指摘〕の② ③への対応について,(1)〜(3)に答えよ。
サマリテーブル S1〜S4 のうち, 〔問題点の指摘〕 の②に該当するものを一つ選び,特定日の例を一つ答えよ。 また, その特定日を除き, SQL 文で正しく更新できない理由を, 20字以内で述べよ。
模範解答
サマリテーブル名:S2 又は S4
特定日の例:
サマリテーブル名を S2と解答した場合
・四半期の初日
サマリテーブル名を S4と解答した場合
・各月の初日
理由:・主キーが重複するから
・挿入すべき行が既に存在するから
解説
1. 模範解答のキーワード・論点整理
- サマリテーブルの主キーは「図4 サマリテーブルの構造」で下線が付いているコード項目のみで構成される
- S2 の下線項目:店舗コード, 商品コード
- S4 の下線項目:商品コード, 社員コード
- 日次更新処理(表5)では,「日付」をキーに含めずに前日の集計結果を INSERT している
- 初回の集計(四半期初日/月初)には該当キーが存在せず INSERT 成功
- 以後は同一キーで INSERT しようとすると「主キー重複」によるエラーまたは挿入失敗
2. なぜ S2(または S4)なのか
サマリテーブル S2 の場合
S2(年,四半期名,**店舗コード**,店舗名,**商品コード**,商品名,売上額)
- 下線部分(主キー)は「店舗コード」「商品コード」のみ
- 表5 の手順 I, II では毎日「前日の行だけを選択し(年・四半期名・店舗コード・商品コード で集計)」→ INSERT
- 四半期の初日にはまだ同一「店舗コード+商品コード」の行が存在しないため INSERT 可
- 四半期の初日を除き,それ以降の日は同じ「店舗コード+商品コード」で再度 INSERT を試みるため
→ 主キー重複 となり SQL 文で正しく更新(INSERT)できない
引用
「図4 サマリテーブルの構造」
S2(年,四半期名,店舗コード,店舗名,商品コード,商品名,売上額)
(下線はコード項目だけに付いており…)「表5 サマリテーブルを更新する手順」
I. …“店舗売上”テーブルから前日の行だけを選択し,GROUP BY 句によって集計した結果行を CSV ファイルに出力
II. INSERT 文を用いて,手順 I の CSV ファイルの全レコードをサマリテーブルに追加
S4 の場合(同様の論理)
S4(年,月,**商品コード**,商品名,**社員コード**,社員名,売上額)
- 下線部分は「商品コード」「社員コード」のみ
- 各月の初日を除き,日次集計を同一「商品コード+社員コード」で INSERT → 主キー重複
3. 受験者が誤りやすいポイント
- 「四半期名」「月」「日」など期間要素をキーに含めていると思い込み,主キー重複の発生タイミングを誤る
- S1 や S3 は日付(日)あるいは商品分類番号をキーに含むため,日付または分類が切り替わるたびに重複しない
- 「特定日の例」を
- S2 → 四半期の初日
- S4 → 各月の初日
という点を間違えない
4. 試験対策として覚えておくべきポイント
- サマリテーブル設計では,主キーに日付や期間識別子を含めないと日次 INSERT 時に重複する
- 日次更新方式には「INSERT のみ」「更新(UPDATE)のみ」「UPSERT(MERGE)」など複数方式がある
- 今回のように INSERT のみで運用するなら,キー設計に 必ず「日付」「月初」など期間を含める
- 問題文中の図や表での「下線」は,しばしば主キーやインデックスの構成列を表すので要チェック
設問3(2):〔問題点の指摘〕 の ① への対応が済んでいることを前提に,〔問題点の指摘〕の② ③への対応について,(1)〜(3)に答えよ。
(1)の問題が解決していることを前提に,表 2 中の分析 B1, B2 の売上額を集計できるサマリテーブルの名称を, それぞれ GROUP BY句による年間の集計対象行数が少ない順に, 全て答えよ。
なお,一つのサマリテーブルから売上額を集計するものとし、必要に応じて次元テーブルを参照するものとする。
模範解答
B1:S1
B2:S3, S4, S2
解説
キーワードと論点の整理
- サマリテーブル(S1~S4)
あらかじめ異なる粒度で集計した売上データを保持するテーブル。図4で定義されている。 - 分析 B1・B2 の要件
表2より- B1:「2009年以降の年別月別店舗名別商品区分名別売上額」
- B2:「2009年以降の年別商品名別売上額」
- 必要な次元属性
- B1:年、月、店舗名、商品区分名
- B2:年、商品名
- 性能評価基準
「GROUP BY句による年間の集計対象行数が少ない順に」
→ サマリテーブルの粒度が粗い(=1行あたりに集める元データ件数が少ない)ほど良い
サマリテーブルの粒度比較
まず,図4の定義をもとに,各サマリテーブルの主な列をまとめると,以下のとおりです。
- 太字は,今回の設問でのポイントとなるキー項目です。
- S1は「商品分類番号/商品分類名」を持つため,商品区分(大分類)での集計に適している。
- S2~S4は「商品コード/商品名」を持つため,商品単位の集計に適している。
解答の論理的説明
B1:「年別月別店舗名別商品区分名別売上額」
- 必要な次元属性は「年」「月」「店舗名」「商品区分名」
- サマリテーブルの中で 商品区分名 を直接持ち,かつ 店舗単位 の集計が可能なのは S1 のみ。
- S2:商品区分ではなく「商品コード/商品名」,さらに粒度は四半期
- S3:支部単位
- S4:社員単位
- したがって,B1は S1 から
SELECT 年, 月, 店舗名, 商品分類名 AS 商品区分名, SUM(売上額) FROM S1 WHERE 年 >= 2009 GROUP BY 年, 月, 店舗名, 商品分類名;
B2:「年別商品名別売上額」
- 必要な次元属性は「年」「商品名」
- 商品レベルの集計が可能なサマリテーブルは S2, S3, S4 の3つ
- 各テーブルに格納されている行数の概算(1年間あたり)
- S3:支部数10 × 月12 × 商品点数3,000 = 360,000行/年
- S4:社員数100 × 月12 × 商品点数3,000 = 3,600,000行/年
- S2:店舗数10,000 × 四半期4 × 商品点数3,000 =120,000,000行/年
- 「年間の集計対象行数が少ない順」に並べると
- S3
- S4
- S2
- 例えば S3 を使う場合は,必要に応じて商品マスタを参照しながら
SELECT 年, 商品名, SUM(売上額) FROM S3 JOIN 商品 USING (商品コード) WHERE 年 >= 2009 GROUP BY 年, 商品名;
受験者が誤りやすいポイント
- 粒度(granularity)の混同
- 「月別」を求めているのに「日別」(S1)や「四半期別」(S2)の集計をそのまま使えると思い込む
- サマリテーブルのキー項目漏れ
- B1に商品区分名が必要にもかかわらず,S2~S4 は「商品分類名」を持たない
- 行数試算のケタ間違い
- 支部数・社員数・店舗数の違いを見落とし,S2やS3の行数を誤って評価してしまう
試験対策として覚えておくべきポイント
- サマリテーブルは「想定クエリの粒度に合うもの」を選ぶ
- より粗い粒度(=キー項目が少ない、集約レベルが高い)ほど行数は少なく,集計コストが低い
- 必要に応じて次元テーブル(商品マスタや支部マスタなど)と結合して名称を補う
- クエリ要件に出てくる「年」「月」「店舗」「支部」「商品区分/商品名/社員」などの属性が,サマリテーブルに含まれているか必ずチェックする
- 行数の試算では,次元のカーディナリティ(数)に着目し,順序関係を正しく判断すること
設問3(3):〔問題点の指摘〕 の ① への対応が済んでいることを前提に,〔問題点の指摘〕の② ③への対応について,(1)〜(3)に答えよ。
分析 B1〜B4 のうち, 〔問題点の指摘〕の③に該当するものを、全て答えよ。
模範解答
B3
解説
キーワード・論点整理
- 「最新の商品分類」
問題文より:「2012年4月15日に,商品分類である生菓子を生洋菓子と生和菓子に分けた」
「…再集計をしないと,この最新の商品分類を反映できない分析がある」 - 分析で利用する軸(表2より)
- 次元変更の影響
- 「商品区分名」(日配食品/加工食品/非食品)は変更なし
- 「商品名」も変更なし
- 「商品分類名」は変更あり(生菓子→生洋菓子/生和菓子)
解答の論理展開
-
問題文の要件
問題文(〔問題点の指摘〕③)では,「2012年4月15日に,商品分類である生菓子を生洋菓子と生和菓子に分けたが,表2中の分析 B1〜B4 のうち, ‘店舗売上’ テーブルから再集計をしないと,この最新の商品分類を反映できない分析がある。」
とあります。要するに,商品分類名の変更を反映させるには,過去データも含めて改めて「店舗売上」から集計し直す必要がある分析がある,ということです。 -
各分析の利用項目と影響
表2から,B1〜B4 が利用している項目を整理します。- B1・B2 は「商品区分名」「商品名」を使い,これらは今回変更がないため,従来集計済みのサマリや次元テーブル結合で問題なく最新の集計結果を得られる。
- B3・B4 は 商品分類名 を利用し,この部分が「生菓子」→「生洋菓子/生和菓子」と変わっている。
-
なぜ B3 のみか
一見 B3・B4 両方とも商品分類名を使うように見えますが,- B4(「年別月別支部名別商品分類名別売上額」)は,サマリテーブルの構造上,支部別・商品分類別 の集計をサマリテーブルから直接算出できず,そもそもサマリテーブル外で別設計の処理が必要な分析です。
- 一方,B3(「年別月別店舗名別商品分類名別売上額」)は,本来サマリテーブル S1 に日次で保持されている (店舗×商品分類名×売上額) のデータを月次累計すれば得られる設計になっているため,普段はサマリテーブル S1→月次集計で処理しているはずです。
- しかし,サマリテーブルは「サマリ更新手順」(表5)で過去行を更新せずに直近日のデータのみ追加しており,商品分類が変わった 2012年4月15日以前 のレコードは,元の「生菓子」の分類名のまま残ってしまっています。
- したがって,B3 は過去の「生菓子」売上を「生洋菓子」「生和菓子」に再分類して最新の分類名で集計するためには,「店舗売上」テーブルから再集計し直す必要があります。
受験者の注意ポイント
- 「商品区分名」と「商品分類名」を取り違えない
→ 今回変更されたのは下位分類の 「商品分類名」(生菓子→生洋菓子/生和菓子)のみ。 - B4 は商品分類名を使うが,サマリテーブルの設計要件の観点で B3 と扱いが異なる
→ B4 はそもそも別途サマリテーブルからの集計方式ではない可能性がある。 - 次元テーブルの変更は,過去行に遡って自動反映されない
→ 「追加された次元のみ最新」「既存業績は更新されない」ことを確認。
試験対策ポイント
- 次元テーブルの履歴管理(Type2 SCD)では,**「過去販売実績を遡って置き換えない」**点を常に意識する。
- 分析軸(商品区分/商品分類/商品名)は階層構造になっており,どの階層が変更されると,どの集計に影響するかを整理しておく。
- サマリテーブル設計の問題点
- どの粒度で保持しているか(日次/月次/支部別…)
- 変更履歴を遡及反映すべきか否か
を検討し,設計要件に応じた再集計(フルリフレッシュ)や増分更新手法を選べるようにする。