名簿の略記を作るAccess(超適当版)


なにこれ?

名簿で「砂川(寛)」のような表記をしていたら「砂川 寛之」さんと「砂川 寛子」さんがいたじゃねーかという人向けのAccess。

とりあえず、データの中の「砂川寛之」さんで

  • 唯一の姓だったら「砂川」
  • 同姓がいたら「砂川(寛)」
  • 名前頭文字1字同一がいたら「砂川(寛之)」(カッコ2字略記)
  • 名前頭文字2字以上同一がいたら「砂川(寛之)」(カッコ名前表記)
  • 同姓同名がいたら「砂川(寛之)[01234]」(カッコ名前表記+カッコ個人番号表記)

というような判別を行って、略記を生成するクエリを作ってみました。

つかいかた

Access .accdb形式です。

「素材データ」に名簿のデータを投入してください。

  • 「氏名」カラムは姓名の間に「 」(空白)を入れてください。全角でも半角でもどちらでも良いです。
  • 「個人番号」は社員番号のような、他の処理に持って行くときに一意に識別できるデータを入れてください。
  • 「生年月日」や「性別」は今のところ使っていません。

「同姓-略記」クエリで結果を得られます。

クエリの構造

「素材データ」が元データです。

「素材データ」→「同姓-00姓名整形」で姓名分割を行います。ついでに「氏名」カラムにNULLがあったときはnz関数をかけます。

「同姓-01完全衝突」「同姓-02名2字衝突」「同姓-03名1字衝突」「同姓-04姓衝突」でそれぞれどのレベルで衝突を行っているのか判定します「件数○○衝突」カラムが0であれば衝突していないデータとなります。

「同姓-略記」で最終的に得られる略記を出力します。

免責事項

適当に作ったので、何か変な動きをするかもしれません。クリティカルな業務に使われて何かあっても責任はとれません。

名前衝突は2字までしか判定しません。略記が3文字になるぐらいならフルネームで表記した方がましだと思ったからです。

名前1字の人と、その1字目が衝突した2字の人(例えば「悟」と「悟郎」)はどう処理するか、全く検討していません。

ひらがな略記が良いかもしれませんが、文字数あたりの衝突件数が多くなるため、やめました。

いろいろしがらみがあってMicsoroft Accessだ、何か文句あるか?

ダウンロード・構造

jpdb-namecollision.accdb.zip [Microsoft Access]

テーブル「素材データ」

  • ID [オートナンバー]
  • 個人番号 [テキスト型]
  • 氏名漢字 [テキスト型]

クエリ「同姓-00姓名整形」

素材データを処理しやすいよう整形

SELECT
  素材データ.ID,
  素材データ.個人番号,
  Nz([氏名漢字],"") AS 氏名整形,
  Left([氏名整形],InStr(1,[氏名整形]," ")-1) AS 氏名姓,
  Mid([氏名整形],InStr(1,[氏名整形]," ")+1) AS 氏名名,
  Left([氏名名],1) AS 氏名名1字,
  Left([氏名名],2) AS 氏名名2字
FROM 素材データ
;

クエリ「同姓-01完全衝突」

完全一致する氏名の抽出

SELECT
  [同姓-00姓名整形].氏名姓,
  [同姓-00姓名整形].氏名名,
  Count([ID])-1 AS 衝突完全件数
FROM [同姓-00姓名整形]
GROUP BY
  [同姓-00姓名整形].氏名姓,
  [同姓-00姓名整形].氏名名
;

クエリ「同姓-02名2字衝突」

名前2文字目まで衝突している氏名の抽出

SELECT
  [同姓-00姓名整形].氏名姓,
  [同姓-00姓名整形].氏名名2字,
  Count([ID])-1 AS 衝突2字件数
FROM [同姓-00姓名整形]
GROUP BY
  [同姓-00姓名整形].氏名姓,
  [同姓-00姓名整形].氏名名2字
;

クエリ「同姓-03名1字衝突」

名前1文字目まで衝突している氏名の抽出

SELECT
  [同姓-00姓名整形].氏名姓,
  [同姓-00姓名整形].氏名名1字,
  Count([ID])-1 AS 衝突1字件数
FROM [同姓-00姓名整形]
GROUP BY
  [同姓-00姓名整形].氏名姓,
  [同姓-00姓名整形].氏名名1字
ORDER BY
  Count([ID])-1 DESC
;

クエリ「同姓-04姓衝突」

姓だけ衝突している氏名の抽出

SELECT
  [同姓-00姓名整形].氏名姓,
  Count([ID])-1 AS 衝突同姓件数
FROM [同姓-00姓名整形]
GROUP BY
  [同姓-00姓名整形].氏名姓
;

クエリ「同姓-略記」

これらのクエリをまとめ、略記表記を求める

SELECT
  [同姓-00姓名整形].ID,
  [同姓-00姓名整形].個人番号,
  [同姓-00姓名整形].氏名整形,
  Switch(
    [衝突完全件数]>0,[氏名姓] & "(" & [氏名名] & ")[" & [個人番号] & "]",
    [衝突2字件数]>0,[氏名姓] & "(" & [氏名名] & ")",
    [衝突1字件数]>0,[氏名姓] & "(" & [氏名名2字] & ")",
    [衝突同姓件数]>0,[氏名姓] & "(" & [氏名名1字] & ")",
    True,[氏名姓]
  ) AS 氏名略記,
  Switch(
    [衝突完全件数]>0,"完全衝突★",
    [衝突2字件数]>0,"名2字衝突",
    [衝突1字件数]>0,"名1字衝突",
    [衝突同姓件数]>0,"同姓衝突",
    True,"衝突なし"
  ) AS 衝突事由,
  [同姓-01完全衝突].衝突完全件数,
  [同姓-02名2字衝突].衝突2字件数,
  [同姓-03名1字衝突].衝突1字件数,
  [同姓-04姓衝突].衝突同姓件数
FROM (
  (
    (
      [同姓-00姓名整形] LEFT JOIN [同姓-01完全衝突] ON
      ([同姓-00姓名整形].氏名姓 = [同姓-01完全衝突].氏名姓) AND
      ([同姓-00姓名整形].氏名名 = [同姓-01完全衝突].氏名名)
    ) LEFT JOIN [同姓-04姓衝突] ON
    [同姓-00姓名整形].氏名姓 = [同姓-04姓衝突].氏名姓
  ) LEFT JOIN [同姓-02名2字衝突] ON
  ([同姓-00姓名整形].氏名名2字 = [同姓-02名2字衝突].氏名名2字) AND
  ([同姓-00姓名整形].氏名姓 = [同姓-02名2字衝突].氏名姓)
) LEFT JOIN [同姓-03名1字衝突] ON
([同姓-00姓名整形].氏名名1字 = [同姓-03名1字衝突].氏名名1字) AND
([同姓-00姓名整形].氏名姓 = [同姓-03名1字衝突].氏名姓)
ORDER BY
  [同姓-00姓名整形].ID
;

謝辞

テストデータ・ジェネレータ(yamagata) – http://yamagata.int21h.jp/tool/testdata/
氏名テストデータを使わせていただきました。