実はZIP_CODE(郵便番号)は重複しているため、地域名を特定できないのです。今回はグループ化を使って郵便番号が重複していることを確認してみましょう。
【1】Accessのファイル「SampleDB3.mdb」を起動し、「SQL練習」のSQLビュー画面を開いてください。
【2】以下のSQL文を入力し、実行ボタン「!」をクリックします。
SELECT TOWN_CD
FROM T03Town;
【3】TOWN_CD一覧が表示されました。
レコード数を見ると、121882件となっています。
次はTOWN_CDをグループ化してみましょう。グループ化とは同じ種類のデータをまとめることです。つまり重複したデータがあれば、まとめて一つのレコードとして表示します。
【4】以下のSQL文を入力し、実行ボタン「!」をクリックします。
SELECT TOWN_CD
FROM T03Town
GROUP BY TOWN_CD;
GROUP BYの後に指定したフィールドでグループ化します。
【5】グループ化したTOWN_CD一覧が表示されました。
しかし前と変わっていません。レコード数を見ると121882件のままです。テーブルT03TownではTOWN_CDは重複することはありませんので、TOWN_CDを使うと各レコードが確実に区別できるのです。
それでは次はZIP_CODE(郵便番号)で確認してみましょう。
【6】以下のSQL文を入力し、実行ボタン「!」をクリックします。
SELECT ZIP_CODE
FROM T03Town;
【7】ZIP_CODE一覧が表示されました。
この段階では重複しているかわかりません。ZIP_CODEもすべてのレコードに書かれているので当然121882件です。それでは次はグループ化してみます。
【8】以下のSQL文を入力し、実行ボタン「!」をクリックします。
SELECT ZIP_CODE
FROM T03Town
GROUP BY ZIP_CODE;
【9】グループ化したZIP_CODE一覧が表示されました。
するとレコード数が118181件に減りました。
121882 - 118181 = 3701
つまり3701件のZIP_CODEは重複していたのです。意外と多いですね。次はもう少し見やすくしてみましょう。
【10】以下のSQL文を入力し、実行ボタン「!」をクリックします。
SELECT ZIP_CODE, Count(ZIP_CODE) AS CNT
FROM T03Town
GROUP BY ZIP_CODE;
Count(ZIP_CODE) AS CNTは演算フィールドです。
Countはデータをカウントする関数です。AS(エイリアス)でCNTというフィールド名を付けています。
【11】カウントしたZIP_CODE一覧が表示されました。
スクロールしてみると、ほとんど「1」なのですが、中には「2」や「3」があります。これが重複している郵便番号です。もっと見やすくするために重複しているデータだけを表示してみましょう。(2件以上を表示ということです。)
【12】以下のSQL文を入力し、実行ボタン「!」をクリックします。
SELECT ZIP_CODE, Count(ZIP_CODE) AS CNT
FROM T03Town
GROUP BY ZIP_CODE
HAVING (Count(ZIP_CODE)>=2);
HAVING (Count(ZIP_CODE)>=2)
グループ化した結果に対する検索条件はWHEREではなくHAVINGを使います。Count(ZIP_CODE)で件数が出ますので、>=2 は2件以上のレコードということになります。
【13】カウントが2件以上のZIP_CODE一覧が表示されました。
レコード数が1497件になっています。
まとめると郵便番号は121882件中、3701件が重複していて、重複している郵便番号は1497種類だということです。一覧を見ると郵便番号「0288401」は20件となっていますので確認してみましょう。
【14】以下のSQL文を入力し、実行ボタン「!」をクリックします。
SELECT TOWN_CD,ZIP_CODE,TOWN_NAME
FROM T03Town
WHERE ZIP_CODE = '0288401';
ZIP_CODEはテキスト型なので「'」(シングルクォーテーション)で囲んでいます。
【15】郵便番号「0288401」一覧が表示されました。
確かに20件の地域名が表示されました。同じ郵便番号の地域が複数あることがわかりますよね。ZIP_CODEでは地域名が特定できないのです。
以上の理由からT04Customer(顧客マスター)は「ZIP_CODE」ではなく「TOWN_CD」を持つ必要があったのです。