応用情報技術者 2023年 春期 午後 問06
KPI達成状況集計システムの開発に関する次の記述を読んで、設問に答えよ。
G社は、創立20年を迎えた従業員500人規模のソフトウェア開発会社である。G社では、顧客企業や業種業界の変化に応じて組織変更を行ってきた。また、スキルや業務知識に応じた柔軟な人事異動によって、人材の流動性を高めてきた。
G社の組織は、表1の例に示すように最大三つの階層から構成されている。
従業員の職務区分には管理職、一般職の二つがあり、1階層から3階層のそれぞれの組織には1名以上の従業員が所属している。なお、複数階層、複数組織の兼務は行わない規定であり、従業員は一つの組織だけに所属する。

〔KPIの追加〕
G社では、仕事にメリハリを付け、仕事の質を向上させることが、G社の業績向上につながるものと考え、従来のKPIに加え、働き方改革、従業員満足度向上に関するKPIの項目を今年度から追加することにした。追加したKPIの項目を表2に示す。

追加したKPIの達成状況を把握し、計画的な目標達成を補助するためにKPI達成状況集計システム(以下、Kシステムという)を開発することになり、H主任が担当となった。
Kシステムでは、次に示す仕組みと情報を提供する。
・従業員各人が、月ごとの目標を設定する仕組み
・日々の実績を月末で集計し、各組織がKPI達成状況を評価するための情報
〔データベースの設計〕
G社では、組織変更と人事異動を管理するためのシステムを以前から運用している。
H主任は、このシステムのためのE-R図を基に、KPIとその達成状況を把握するために、KPI、月別個人目標、及び月別個人実績の三つのエンティティを追加して、KシステムのためのE-R図を作成することにした。
作成したE-R図(抜粋)を図1に示す。Kシステムでは、このE-R図のエンティティ名を表名にし、属性名を列名にして、適切なデータ型で表定義した関係データベースによってデータを管理する。

追加した三つのエンティティを基に新規に作成された表の管理内容と運用方法を表3に示す。

組織、所属、従業員、及び役職の各表は、以前から運用しているシステムから継承したものである。組織表と所属表では、組織や所属に関する開始年月日と終了年月日を保持し、現在を含む、過去から未来に至るまでの情報を管理している。
組織表の“組織終了年月日”と所属表の”所属終了年月日”には、過去の実績値、又は予定を設定する。終了予定のない場合は9999年12月31日を設定する。
なお、組織表の“上位組織コード”、”上位組織開始年月日”には、1階層組織ではNULLを、2階層組織と3階層組織では一つ上位階層の組織の組織コード、組織開始年月日を設定する。また、役職表の“職務区分”の値は、管理職の場合に‘01’、一般職の場合に‘02’とする。
〔達成状況集計リストの作成〕
H主任は、各組織がKPI達成状況を評価するための情報として、毎月末に達成状況集計リスト(以下、集計リストという)を作成し、提示することにした。
集計リスト作成は、オンライン停止時間帯の日本バッチ処理終了後の月次バッチ処理によって、処理結果を一時表に出力して後続処理に連携する方式で行うことにした。
集計リスト作成処理の概要を表4に示す。

集計リスト作成処理のSQL文を図2に示す。ここで、TO_DATE関数は、指定された年月日をDATE型に変換するユーザー定義関数である。関数COALESCE(A,B)は、AがNULLでないときはAを、AがNULLのときはBを返す。また、“:年度開始年月月”、“:集計年月日”、“:集計年月月”は、該当の値を格納する埋込変数である。
H主任は、図2の項番4のSQL文の設計の際に、次に示す考慮を行った。
・表2の評価方法に従い、管理職の従業員データは対象に含めず、年度途中入社と、年度途中退職の従業員データについては出力しないように、抽出日に退職している従業員データを出力しない“従業員_所属_一時表”と、年度開始時点で入社していない従業員データを出力しない“従業員ごと_目標集計_一時表”をcによって結合しておく。
・cによる結合結果と、実績がある場合だけレコードの存在する“従業員ごと_実績集計_一時表”をdによって結合しておく。また、①実績個人集計がNULLの際は、0を設定しておく。

設問1:
図1中のa、bに入れる適切なエンティティ間の関連及び属性名を答え、E-R図を完成させよ。
なお、エンティティ間の関連及び属性名の表記は、図1の凡例及び注記に倣うこと。
模範解答
a:→
b:従業員コード
解説
解答の論理構成
- 図1の凡例では、エンティティ間の関連は「→:1対多」で表すと明示されています。リレーション一覧にも
“従業員 → 所属(1対多)”
とあるので、a は「従業員から所属へ向かう矢印」つまり “→” になります。 - 所属表の主キーには “従業員コード” が含まれており、さらに “月別個人目標”、“日別個人実績” でも同じ項目名が用いられています。
したがって、従業員表の主キーも統一して “従業員コード” である必要があります。 - 以上より
a:→
b:従業員コード
が成立し、E-R図全体の整合が取れます。
誤りやすいポイント
- 矢印の向きを逆にして “所属 → 従業員” としてしまう。1人の従業員が複数回所属する履歴を持つため、「1対多」の “1” が従業員側になることを見落としがちです。
- “社員ID” や “社員番号” など、自社の慣習的な項目名を書いてしまう。試験では【問題文】にある “従業員コード” 以外は認められません。
FAQ
Q: 兼務が禁止されている点はエンティティ間の関連に影響しますか?
A: 兼務禁止でも「1人の従業員が時点ごとに1つの所属」を持つ履歴構造は変わりません。従って関連は “1対多” のままです。
A: 兼務禁止でも「1人の従業員が時点ごとに1つの所属」を持つ履歴構造は変わりません。従って関連は “1対多” のままです。
Q: 従業員コードは数値型と文字列型のどちらで設計すべきですか?
A: 設問は属性名のみを問うており、データ型は要求されていません。実務では管理方針に応じて選択します。
A: 設問は属性名のみを問うており、データ型は要求されていません。実務では管理方針に応じて選択します。
Q: “所属開始年月日” が主キーに含まれる理由は?
A: 同一従業員が異動するたびにレコードを追加し履歴を保持するため、開始年月日で一意に識別する設計です。
A: 同一従業員が異動するたびにレコードを追加し履歴を保持するため、開始年月日で一意に識別する設計です。
関連キーワード: 主キー, 1対多, 履歴管理, エンティティ, リレーション
設問2:〔達成状況集計リストの作成〕について答えよ。
(1)本文及び図2中のc~iに入れる適切な字句を答えよ。
模範解答
c:INNER JOIN
d:LEFT OUTER JOIN
e:BETWEEN
f:B.職務区分 = '02'
g:GROUP BY従業員コード、KPIコード
h:組織ごと_目標実績集計_一時
i:COUNT(*)
解説
解答の論理構成
-
【問題文】では「管理職の従業員データは対象に含めず、年度途中入社と、年度途中退職の従業員データについては出力しないように、…“従業員_所属_一時表”と、…“従業員ごと_目標集計_一時表”をcによって結合しておく。」と明記されています。双方に必ず存在する従業員のみを扱うため、等価結合かつ絞り込み効果のある INNER JOIN が最適です。
⇒ c:INNER JOIN -
実績は「実績がある場合だけレコードの存在する“従業員ごと_実績集計_一時表”」と記載されています。目標は必ず存在するが実績は存在しない場合があるため、左側(目標)を残す LEFT OUTER JOIN が必要となります。
⇒ d:LEFT OUTER JOIN -
項番1〜3の WHERE 句はいずれも「開始日 ≦ 対象 ≦ 終了日」の範囲判定です。SQL で範囲条件を簡潔に記述する BETWEEN が自然です。
⇒ e:BETWEEN -
管理職除外条件は【問題文】「役職表の“職務区分”の値は、管理職の場合に‘01’、一般職の場合に‘02’とする。」とあります。項番1の抽出では一般職のみ対象なので B.職務区分 = '02' を追加します。
⇒ f:B.職務区分 = '02' -
項番2・3では集計列以外を GROUP BY する必要があります。「従業員コード, KPIコード」で集計するので GROUP BY 従業員コード、KPIコード を記述します。
⇒ g:GROUP BY 従業員コード、KPIコード -
項番4の INSERT 先は表4「組織ごと_目標実績集計_一時」と一致します。
⇒ h:組織ごと_目標実績集計_一時 -
対象従業員数は「一般職従業員と所属組織の対応表」に対してレコード件数を数えればよいので COUNT() が最短です。
⇒ i:**COUNT()**
誤りやすいポイント
- 実績表にない従業員を残すため RIGHT ではなく LEFT OUTER JOIN を使う点を混同しやすいです。
- 職務区分の値を ‘2’ と誤記し、‘02’ という 固定 2 桁 を落としがちです。
- BETWEEN は終端を含むため、終了年月日が「9999年12月31日」のケースでも正しく抽出できると気付かず、>= / <= を個別に書いてしまうことがあります。
- GROUP BY の列を忘れ SUM だけ書き、集計エラーになるケースが典型です。
FAQ
Q: INNER JOIN と WHERE 句による等価結合のどちらを使っても良いですか?
A: どちらでも機能的には同じですが、可読性と結合意図の明確化のため INNER JOIN を推奨しています。設問も JOIN 句を空欄にしているので JOIN 形式で答えることが期待されています。
A: どちらでも機能的には同じですが、可読性と結合意図の明確化のため INNER JOIN を推奨しています。設問も JOIN 句を空欄にしているので JOIN 形式で答えることが期待されています。
Q: LEFT OUTER JOIN で NULL を 0 に変換する理由は?
A: 実績が未登録でも平均値算出時に欠損とならないよう「①実績個人集計がNULLの際は、0を設定しておく。」と記載されています。COALESCE で NULL→0 を行うことで SUM の結果が正しくなります。
A: 実績が未登録でも平均値算出時に欠損とならないよう「①実績個人集計がNULLの際は、0を設定しておく。」と記載されています。COALESCE で NULL→0 を行うことで SUM の結果が正しくなります。
Q: 9999年12月31日を終了予定なしの値としているが、BETWEEN で大丈夫?
A: BETWEEN は終端値を含むので、「… ≤ 9999-12-31」も真になり、終了予定なしのレコードもしっかり抽出されます。
A: BETWEEN は終端値を含むので、「… ≤ 9999-12-31」も真になり、終了予定なしのレコードもしっかり抽出されます。
関連キーワード: INNER JOIN, OUTER JOIN, BETWEEN, GROUP BY, COALESCE
設問2:〔達成状況集計リストの作成〕について答えよ。
(2)本文中の下線①に示す事態は、年度開始年月日から集計年月日までの間に、どのデータがどのような場合に発生するか。40字以内で答えよ。
模範解答
該当従業員のKPI項目に対する実績データが、1件も存在しない場合
解説
解答の論理構成
-
図2の項番4では、
sql d 従業員ごと_実績集計_一時 C ON B.従業員コード = C.従業員コード AND B.KPIコード = C.KPIコードとして結合しています。ここで d は実績側に行がなくても目標側の行を残す必要があるため、外部結合になります。 -
表4の項番3にある
“日別個人実績…日別実績のない従業員のレコードは作成しない。”
という運用により、実績が発生していない従業員・KPIの組合せは “従業員ごと_実績集計_一時” にレコードそのものが生成されません。 -
したがって、左側(目標集計表)には行が存在するが右側(実績集計表)には行がない状態で外部結合が行われ、C.実績個人集計 が NULL になります。
-
この NULL を
SUM(COALESCE(C.実績個人集計, 0))
で に置き換えて集計するため、①の事態は「実績レコードが 1 件も無い場合」と読み取れます。 -
以上から、下線①に示す事態は
“該当従業員のKPI項目に対する実績データが、1件も存在しない場合”
となります。
誤りやすいポイント
- “年度途中退職や管理職だから NULL になる” と考えがちですが、退職者や管理職は c の結合で除外済みです。
- NULL と の違いを見落とし、外部結合ではなく内部結合と誤解してしまうケースがあります。
- “日別実績値が 0 の行がある” と誤認する受験者もいますが、0 の行があればレコードは存在するため NULL にはなりません。
FAQ
Q: 実績が 0 日でもレコードが作成される場合はありますか?
A: ありません。表4の運用で “日別実績のない従業員のレコードは作成しない” と明記されています。
A: ありません。表4の運用で “日別実績のない従業員のレコードは作成しない” と明記されています。
Q: 管理職は最初から対象外ですが、目標は入力するとあります。目標だけあって実績が NULL になるパターンは?
A: 管理職は c の結合で除外されるため、目標も実績も最終集計には現れません。NULL になるのは一般職のみです。
A: 管理職は c の結合で除外されるため、目標も実績も最終集計には現れません。NULL になるのは一般職のみです。
Q: COALESCE を使わずに集計するとどうなりますか?
A: SUM 集計に NULL が含まれると無視されるため、NULL のままでは組織集計が欠落します。COALESCE で に変換することで欠損を防いでいます。
A: SUM 集計に NULL が含まれると無視されるため、NULL のままでは組織集計が欠落します。COALESCE で に変換することで欠損を防いでいます。
関連キーワード: 外部結合, NULL処理, 集約関数, COALESCE


