SELECT [datamoves].*,
(CASE  
WHEN [DataMoves].[異動事由コード] = 11 THEN '01' --国外転出→抹消
WHEN [DataMoves].[異動事由コード] = 12 THEN '05' --県外転出→表示有権者（都道府県外転出４ヶ月以内）
--TODO 「４ヶ月以内」でなかった場合
WHEN [DataMoves].[異動事由コード] = 13 THEN '04' --県内転出→表示有権者（都道府県内転出４ヶ月以内）
WHEN [DataMoves].[異動事由コード] = 14 THEN '02' --転出取消→有権者
WHEN [DataMoves].[異動事由コード] = 21 THEN '01' --失権→抹消
WHEN [DataMoves].[異動事由コード] = 31 THEN '01' --誤載→抹消
WHEN [DataMoves].[異動事由コード] = 32 THEN '07' --新住所地→転居者
WHEN [DataMoves].[異動事由コード] = 33 THEN '01' --４ヶ月抹消→抹消
WHEN [DataMoves].[異動事由コード] = 34 THEN '08' --補正登録→新登録者
WHEN [DataMoves].[異動事由コード] = 41 THEN '01' --死亡→抹消
WHEN [DataMoves].[異動事由コード] = 42 THEN '01' --国籍喪失→抹消
WHEN [DataMoves].[異動事由コード] = 43 THEN '01' --失踪宣告→抹消
WHEN [DataMoves].[異動事由コード] = 51 THEN '06' --職権消除→表示有権者（職権消除４ヵ月以内）
WHEN [datamoves].[異動事由コード] = 52 THEN '02' --職権回復→有権者
WHEN [datamoves].[異動事由コード] = 61 THEN '07' --在外移転→転居者
ELSE NULL
END) AS [状態区分],
(CASE 
WHEN [DataMoves].[異動事由コード] = 11 THEN '22' --消除_国外転出
WHEN [DataMoves].[異動事由コード] = 12 THEN '21' --消除_国内転出
WHEN [DataMoves].[異動事由コード] = 13 THEN '21'
WHEN [DataMoves].[異動事由コード] = 14 THEN '09' --記載_異動の取消し（増）
WHEN [DataMoves].[異動事由コード] = 41 THEN '10' --消除_死亡
WHEN [DataMoves].[異動事由コード] = 42 THEN '25' --消除_職権消除（国籍喪失）	日本人住民のみ
WHEN [DataMoves].[異動事由コード] = 43 THEN '10' --失踪宣告→消除_死亡
WHEN [DataMoves].[異動事由コード] = 51 THEN '26' --消除_職権消除
WHEN [DataMoves].[異動事由コード] = 52 THEN '09' --記載_異動の取消し（増）
ELSE NULL --住基由来でないならNULLにしておく
END) AS [住基_異動事由],
(CASE 
WHEN [DataMoves].[異動事由コード] = 11 THEN '18' --変更_転出表示
WHEN [DataMoves].[異動事由コード] = 12 THEN '18' --変更_転出表示
WHEN [DataMoves].[異動事由コード] = 13 THEN '18' --変更_転出表示
WHEN [DataMoves].[異動事由コード] = 14 THEN '19' --変更_再転入（表示消除）
WHEN [DataMoves].[異動事由コード] = 31 THEN '17' --減_誤載
WHEN [DataMoves].[異動事由コード] = 32 THEN '18' --TODO 「新住所地」は「変更_転出表示」？「減_国内転出後4ヶ月経過」？
WHEN [DataMoves].[異動事由コード] = 33 THEN 
      '12' --TODO ４ヶ月抹消されている異動事由を探さないといけない
WHEN [DataMoves].[異動事由コード] = 34 THEN '09' --増_補正登録
WHEN [DataMoves].[異動事由コード] = 61 THEN '16' --減_在外選挙人名簿の登録移転
ELSE NULL
END) AS [選挙人名簿異動事由]
FROM
(SELECT [選挙人異動情報].[個人番号], [選挙人異動情報].[名簿区分], [選挙人異動情報].[執行日],
MIN(優先順位) AS [最優先順位]
FROM [選挙人異動情報]
LEFT JOIN [異動事由コードマスタ]
ON [選挙人異動情報].[異動事由種別] = [異動事由コードマスタ].[異動事由種別]
AND [選挙人異動情報].[異動事由コード] = [異動事由コードマスタ].[異動事由コード]
AND [選挙人異動情報].[名簿区分] = [異動事由コードマスタ].[名簿区分]
GROUP BY [選挙人異動情報].[個人番号], [選挙人異動情報].[名簿区分], [選挙人異動情報].[執行日]) AS [PersonHeader]
LEFT JOIN (
SELECT [選挙人異動情報].[個人番号], [選挙人異動情報].[名簿区分], [選挙人異動情報].[執行日],
[選挙人異動情報].[異動事由種別], [選挙人異動情報].[異動事由コード],
[選挙人異動情報].[異動届出日],　[選挙人異動情報].異動日, [選挙人異動情報].[異動処理日],
[選挙人異動情報].[異動修正区分], 
[異動事由コードマスタ].[ホストコード],[異動事由コードマスタ].[優先順位],
[異動事由コードマスタ].[名称],[異動事由コードマスタ].[短縮名], [異動事由コードマスタ].[抄本表記]
FROM
[選挙人異動情報] 
LEFT JOIN [異動事由コードマスタ]
ON [選挙人異動情報].[異動事由種別] = [異動事由コードマスタ].[異動事由種別]
AND [選挙人異動情報].[異動事由コード] = [異動事由コードマスタ].[異動事由コード]
AND [選挙人異動情報].[名簿区分] = [異動事由コードマスタ].[名簿区分]
)
AS [DataMoves]
ON [PersonHeader].[個人番号] = [DataMoves].[個人番号] 
 AND [PersonHeader].[名簿区分] = [DataMoves].[名簿区分]
 AND [PersonHeader].[執行日] = [DataMoves].[執行日]
 AND [PersonHeader].[最優先順位] = [DataMoves].[優先順位]
ORDER BY [DataMoves].[個人番号], [DataMoves].[執行日], [DataMoves].[名簿区分], 優先順位, 異動日 DESC