戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2012年 秋期 午前(科目A)25


問題文

ある企業では、顧客マスタファイル、商品マスタファイル、担当者マスタファイル及び当月受注ファイルを基にして、月次で受注実績を把握している。各ファイルの項目が表のとおりであるとき、これら四つのファイルを使用して当月分と直前の3か月分の出力が可能な受注実績はどれか。
基本情報技術者 2012年 秋期 午前(科目A) 問25の問題画像

選択肢

顧客別の商品別受注実績
商品別の顧客別受注実績
商品別の担当者別受注実績
担当者別の顧客別受注実績(正解)

受注実績の出力可否判定【午前2 解説】

要点まとめ

  • 結論:正解は (担当者別の顧客別受注実績)。当月は当月受注で集計でき、過去3か月分は顧客マスタの月別合計で補えるため出力可能である。
  • 根拠:顧客マスタに「担当者コード」と「前月・2か月前・3か月前受注額」があり、当月は当月受注明細の集計で顧客ごとに算出できるから。
  • 差がつくポイント:商品別の顧客・担当者の過去内訳は商品マスタに顧客別履歴がないため再現不能であり、ここを見抜けるかで正誤が分かれる。

正解の理由

顧客別×担当者別の各月実績を作るには「顧客→担当者」マッピングと各月の顧客単位実績が必要です。
問題のファイル群では顧客マスタに担当者コードと過去3か月分の顧客別受注額(前月、2か月前、3か月前)が保持され、当月受注ファイルに当月の顧客・商品・受注額(=当月合計)があります。したがって、当月は当月受注を顧客ごとに集計して顧客マスタの担当者でグルーピングすれば担当者別の顧客別集計が可能です。過去3か月は顧客マスタの各月総額を用いて同様に担当者毎に集計できます。これにより、担当者別の顧客別受注実績(当月+直前3か月分)を正しく出力できます。

よくある誤解

  • 「商品マスタに前月などの金額があるから商品×顧客の過去内訳も分かる」と考える誤り:商品マスタは商品単位の月別合計であり、顧客別の内訳は保持していません。
  • 「当月受注が合計だから過去も同様に細分類できる」と誤解する:当月受注は顧客×商品の明細(または合計)で当月分の粒度は分かるが、過去月の顧客×商品または商品×担当者の明細は存在しない点を見落としやすい。
  • 「担当者マスタがあるから商品別担当者別も作れる」と単純に考えるミス:担当者マスタはコードと氏名のみで、商品に対する担当割当や過去の商品別実績は含みません。

解法ステップ

  1. 当月受注ファイルを顧客コードごとに受注額を合計し、各顧客の当月合計を作る。
  2. 顧客マスタから顧客コード→担当者コード、前月・2か月前・3か月前受注額を取得する。
  3. ステップ1の当月合計とステップ2の過去3か月分を顧客ごとに並べ、担当者コードでグルーピングして担当者別の顧客別実績を作成する。
  4. 必要なら担当者マスタと結合して担当者名を付与する。
(出力は「担当者別」ごとに、その担当が担当する各顧客の当月・前月・2か月前・3か月前の受注額を一覧にする形式)

選択肢別の誤答解説

  • ア: 顧客別の商品別受注実績
    • 誤り。顧客×商品ごとの当月は当月受注で得られる可能性があるが、直前3か月分については顧客マスタ・商品マスタともに顧客×商品単位の内訳を保持しておらず再現できない。
  • イ: 商品別の顧客別受注実績
    • 誤り。表示の向きが違うだけで上記と同様に過去3か月の顧客別内訳が商品マスタにないため不可。
  • ウ: 商品別の担当者別受注実績
    • 誤り。担当者は顧客に紐づくため、商品別に担当者別集計を作るためには商品×顧客の過去内訳が必要だが、過去3か月分は存在しないので不可。
  • : 担当者別の顧客別受注実績
    • 正解。顧客マスタに担当者コードと過去3か月分の顧客別受注額があり、当月は当月受注の顧客集計で補えるため、担当者別・顧客別に直近4か月分を出力可能である。

補足コラム

  • データ設計の観点からは、過去集計を必要とする分析には「トランザクション(取引)テーブルを保存する」か「顧客×月×商品などのスナップショットテーブル」を作ることが望ましいです。現在の設計は「顧客単位」と「商品単位」で別々に月次合計を持っているため、組合せの内訳を再現できません。
  • データウェアハウス設計では、事実テーブル(fact)に取引ごとの行を持たせ、次元テーブル(dimension)で顧客・商品・担当者を管理する「星スキーマ」が一般的です。これにより任意の切り口で過去実績を集計できます。
  • 実務的な改善策:月次バッチで「顧客×商品×月」の集計を蓄積するマテリアライズドビューを作成すると、多様な切り口の月次比較が容易になります。
SQL例(概念示例)
-- 当月:顧客ごとの合計を作成
WITH cur_month AS (
  SELECT 顧客コード, SUM(受注額) AS 当月受注額
  FROM 当月受注
  GROUP BY 顧客コード
),
-- 顧客マスタから過去3か月分を行に展開(前月、2か月前、3か月前)
cust_past AS (
  SELECT 顧客コード, 担当者コード, '当月' AS 期間, NULL AS 月受注額 FROM 顧客マスタ WHERE 1=0
  UNION ALL
  SELECT 顧客コード, 担当者コード, '前月', 前月受注額 FROM 顧客マスタ
  UNION ALL
  SELECT 顧客コード, 担当者コード, '2か月前', 2か月前受注額 FROM 顧客マスタ
  UNION ALL
  SELECT 顧客コード, 担当者コード, '3か月前', 3か月前受注額 FROM 顧客マスタ
)
-- 当月分を結合して担当者別×顧客別の各期間を得る
SELECT cp.担当者コード, cp.顧客コード, cp.期間,
       CASE WHEN cp.期間 = '当月' THEN cm.当月受注額 ELSE cp.月受注額 END AS 受注額
FROM (
  -- 当月行を生成(顧客ごとに担当者を付与)
  SELECT m.顧客コード, m.担当者コード, '当月' AS 期間, NULL AS 月受注額
  FROM 顧客マスタ m
  UNION ALL
  -- 過去3か月分はcust_pastで既に展開済み
  SELECT 顧客コード, 担当者コード, 期間, 月受注額 FROM cust_past WHERE 期間 != '当月'
) cp
LEFT JOIN cur_month cm ON cp.顧客コード = cm.顧客コード
ORDER BY cp.担当者コード, cp.顧客コード, cp.期間;
簡単な実装ヒント(Python pandas)
# 当月集計
cur = df_orders.groupby('顧客コード', as_index=False)['受注額'].sum().rename(columns={'受注額':'当月受注額'})
# 顧客マスタ読み込み
cust = df_customers[['顧客コード','担当者コード','前月受注額','2か月前受注額','3か月前受注額']]
# 当月をマージして担当者でグループ化
merged = cust.merge(cur, on='顧客コード', how='left').fillna(0)
# 担当者別の顧客別一覧を保持(必要に応じて集計)
result = merged.sort_values(['担当者コード','顧客コード'])

FAQ

Q1: 当月受注が「当月の合計受注額」とあるが明細がないとダメですか?
A1: 当月受注ファイルに顧客コード・商品コード・受注額があるため、顧客ごとの当月合計はファイル内で集計できます。明細が1行で顧客合計になっていても顧客コード単位で当月合計が得られれば問題ありません。
Q2: 商品マスタの前月・2か月前・3か月前受注額は使えないのですか?
A2: 商品単位の月次合計としては使えますが、商品×顧客あるいは商品×担当者といった組合せ別の過去内訳を再現する情報は含んでいません。したがって選択肢のア・イ・ウのような組合せ別過去集計には不十分です。
Q3: 担当者マスタは必須ですか?
A3: 出力で担当者の氏名を表示したい場合は担当者マスタが必要です。集計自体は顧客マスタの担当者コードで可能です。

関連キーワード: データ集計、月次集計、マスタ設計、正規化、SQL、OLAP、データウェアハウス、集計テーブル、集計ロジック
← 前の問題へ次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について