Access学習メモ 7-21. SQL基礎学習㉑

Access学習メモ 7-21. SQL基礎学習㉑

コンテンツ
学び
「ふるさと納税」
ゆかりのある自治体、応援したい自治体、お気に入りの特産品を扱う自治体に対し寄附をおこなうことで、
納税者が在籍する都道府県や市町村の枠を超え、寄附先の自治体に住民税が振り替えられる形となる制度。

Accessで作成したテーブル「受入額」に「自治体が受ける寄附金」を示した。自治体にとっての収益である。
一方、テーブル「控除額」には、「本来なら自治体が受け取るはずの住民税の内、他自治体への寄附により失った住民税」を示した。
自治体にとっての損失である。
リレーションシップ.png

ふるさと納税制度による受入額から控除額を差し引くことによって
「自治体はお金が増えた(流入超過)のか、減った(流出超過)のか」
税収への影響を可視化できる。

Accessで計算をおこなうために必要とされた準備
①「都道府県」フィールドの条件統一(学習メモ7-19)
もともと用意したマスタテーブル「自治体リスト」の都道府県名は都道府県の表記抜きである。
マスタ.png

一方、「受入額」&「控除額」の各トランザクションテーブルに用意された都道府県名は、都道府県の表記まで綴られたものだった。

②「自治体ID」フィールドの条件統一(学習メモ7-20)
マスタテーブル「自治体リスト」で管理番号として使用されている都道府県別の「自治体ID」は「受入額」&「控除額」の各トランザクションテーブルにはもともと表示されていなかった。
もと受入テーブル.png

もと控除テーブル.png

Accessで各都道府県別に「ふるさと納税受入額-住民税控除額」を集計するにあたり、
①各テーブル間で「都道府県名」表記の差異があったり
②3つのテーブルの橋渡し役となる「自治体ID」キーに空欄があったり
データの不整合があることで、テーブル同士のデータ受け渡し(リレーション)ができず計算がおこなえないため
①学習メモ7-19にて各テーブルの自治体名を統一し
【正】受入額ランキング.png

【正】控除額ランキング.png

②学習メモ7-20にて「受入額」&「控除額」自治体IDレコードに数字を適用した。
受入更新できた.png

控除更新できた.png

Accessで計算をおこなうために今回、必要なSQL
・自治体リスト(マスタ)
・受入額テーブル(トランザクション)
・控除額テーブル(トランザクション)
それぞれ結合(リレーション)し
「受入額-控除額」を算定し(集計クエリ)
算出結果「収支額」を大きい額から小さい額へと並べ替え(ORDER BY)

「収支額」は本制度による流入額(寄附金総額)だけでなく、他の自治体への流出額(控除処理を必要とする税額総計)を含めて算出された金額。
「自治体に入ってきた寄附金総額」から
「他の自治体へ寄附された住民税控除額」を差し引く事で
各自治体の税収の動きを検証。
プラスなら流入超過、マイナスなら流出超過と判断することが可能。

【案1】
SELECT
    自治体リスト.[都道府県],
    受入額.[受入額(億円)],
    控除額.[住民税控除額(億円)],
    受入額.[受入額(億円)]
        - 控除額.[住民税控除額(億円)] AS [収支(億円)]
FROM
    (自治体リスト
    INNER JOIN 受入額
       ON 自治体リスト.[自治体ID] = 受入額.[自治体ID])
    INNER JOIN 控除額
       ON 自治体リスト.[自治体ID] = 控除額.[自治体ID]
ORDER BY
    受入額.[受入額(億円)] - 控除額.[住民税控除額(億円)] DESC;
無クエリ.png

SQL Roundなし.png

最初の課題
一部の自治体の[収支(億円)]の小数点以下の桁数が莫大に
Round未済.png

コンピューターはすべての数値を0と1の「2進数」で処理する。
私たちが使う「10進数の小数」の中には、2進数に変換したときに割り切れず、小数点以下の数値が無限に続いてしまうケースがある。
Accessの内部(Double型やSingle型など)で引き算した結果、最後にほんのわずかな「端数」が残ってしまうと
極小の ...000000003 という数字になって表面化してしまう。

解決案1:
テーブルやクエリのフィールドプロパティシートの書式設定で
小数点以下桁数をあらかじめ「2桁」に設定。
それぞれ変更してみたが、解決しない。
プロパティシート1.png

プロパティシート2.png

プロパティシート.png

フィールドプロパティ1.png

フィールドプロパティ2.png

それでもやっぱり、おかしい表示のまま
Round前の数値.png

解決案2:
SQLで Round 関数を使って四捨五入

SQLの中で Round 関数 を使い、計算結果を「小数点以下2桁」で四捨五入。
SQLの SELECT 部分を
Round(計算式, 2) に書き換えて実行。

SELECT
    自治体リスト.[都道府県],
    受入額.[受入額(億円)],
    控除額.[住民税控除額(億円)],
Round(受入額.[受入額(億円)] - 控除額.[住民税控除額(億円)], 2) AS [収支(億円)]
FROM
    (自治体リスト
    INNER JOIN 受入額
       ON 自治体リスト.[自治体ID] = 受入額.[自治体ID])
    INNER JOIN 控除額
       ON 自治体リスト.[自治体ID] = 控除額.[自治体ID]
ORDER BY
    受入額.[受入額(億円)] - 控除額.[住民税控除額(億円)] DESC;

クエリデザイン画面上では、Round関数分のフィールドが増える形となる。
書式設定のためのフィールドなので、非表示とする。
ありクエリ.png

SQL Roundあり.png

これで一律、小数点第二位に整えた数値を算出できました。
Round済.png

Roundの数値.png

一覧にしてみる。収支(億円)の降順(上位ランキング)表示
レポート.png

ふるさと納税による特産品の受注は、漁業・農業・林業・宿泊・飲食などの就業者比率が高い自治体ほど効果が大きいとされ、地域産業の売上確保・雇用維持に繋がると言われているけど、実際にその土地で生活を営む人々の暮らしに少しでも貢献できているといいな。
家計を預かる主婦としては、つい高コスパの返礼品を頼りたくなってしまう。返礼品により家計が助かる部分は否めないが、そこで日々の生活を営む人々の倹約などの下支えがあってこその恩恵ということを忘れないようにしたい。


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す