目次
なにこれ?
名簿で「砂川(寛)」のような表記をしていたら「砂川 寛之」さんと「砂川 寛子」さんがいたじゃねーかという人向けの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/
氏名テストデータを使わせていただきました。