- ベストアンサー
市郡別の集計方法について Access
市郡区別に集計したいのですが何かよい方法はないでしょうか? 地方公共団体コードと住所、郵便番号があります。 県集計に関してはコードの県の部分を使うだけでよいのですが、 市郡区別(神津島村や八丈町などの市郡区がない地区を含めた、) 集計はどのようにすればよいでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
全国地方公共団体コード http://ja.wikipedia.org/wiki/%E5%85%A8%E5%9B%BD%E5%9C%B0%E6%96%B9%E5%85%AC%E5%85%B1%E5%9B%A3%E4%BD%93%E3%82%B3%E3%83%BC%E3%83%89 郵便番号データダウンロード http://www.post.japanpost.jp/zipcode/dl/kogaki.html 上記の資料を基に話を進めます。 全国の地名(郵便番号)は12万件以上あるので、住所を基に、正確に集計するには、相当手間が掛かると思います。住所が手入力なら、表記に一貫性があるかも疑問です。 地方公共団体コードがあるのなら、これを利用する方法をお勧めします。 しかし、群、支庁には一貫したルールがないので、一部例外処理が必要です。 北海道の町村は群ではなく、支庁ごとにグループ化されてるらしいです(30番おき)。 コード 住所 01303 北海道 石狩郡当別町 01304 北海道 石狩郡新篠津村 01331 北海道 松前郡松前町 01332 北海道 松前郡福島町 01333 北海道 上磯郡知内町 その他の都府県については、郡ごとにグループ化され、20番おきの番号から始まるらしいです。しかし、沖縄県島尻郡に例外があります。 コード 住所 47329 沖縄県 中頭郡西原町 47348 沖縄県 島尻郡与那原町 47350 沖縄県 島尻郡南風原町 47353 沖縄県 島尻郡渡嘉敷村 47354 沖縄県 島尻郡座間味村 47355 沖縄県 島尻郡粟国村 47356 沖縄県 島尻郡渡名喜村 47357 沖縄県 島尻郡南大東村 47358 沖縄県 島尻郡北大東村 47359 沖縄県 島尻郡伊平屋村 47360 沖縄県 島尻郡伊是名村 47361 沖縄県 島尻郡久米島町 47362 沖縄県 島尻郡八重瀬町 47375 沖縄県 宮古郡多良間村 上記の例外を加味すると、下記の様になります。 分類:IIf(Mid([コード],3,1)<'3',[コード],IIf(Left([コード],2)='01','01' & Int(Int(Mid([コード],3,3))/30)*30,IIf(Left([コード],4)='4736','47340',Left([コード],2) & Int(Int(Mid([コード],3,3))/20)*20))) 上記のフィールドをクエリに追加し、これで集計してみて下さい。 これで、群、又は支庁別の集計になると思います。
その他の回答 (2)
- bonaron
- ベストアンサー率64% (482/745)
No1さんの言うとおり、どのように集計したいかによります。 地方公共団体コードの 1、2桁は県コード 3桁目は、 1:特別区 2:市 3:郡支庁(4もあるようです) を表します。 下記URLを参照すると、一例として 3桁目が、1あるいは2の場合は 地方公共団体コード(5桁、または6桁) それ以外の場合は、4桁のみを切り出して グループ化すれば良いかと思いますが。 http://www.tt.rim.or.jp/~ishato/tiri/code/kanto.htm
Q、集計はどのようにすればよいでしょうか? A、どうするつもりですか? 質問を勝ってに解釈し、市区郡外に合致する住所をカウントする手法をもって回答とします。 住所録: ID__住所 1___東京都神津島村904番地 2___東京都八丈島八丈町大賀郷23451 3___東京都八丈島小郡町121 クエリ1: 市区郡外カウント 2 SELECT Count(*) AS 市区郡外カウント FROM 住所録 WHERE INSTR(1,[住所],'市',1)=0 And INSTR(1,[住所],'区',1)=0 And INSTR(1,[住所],'郡',1)=0; クエリ2: 市区郡外カウント 3 SELECT Count(*) AS 市区郡外カウント FROM 住所録 WHERE INSTR(1,BX([住所]),'市',1)=0 And INSTR(1,BX([住所]),'区',1)=0 And INSTR(1,BX([住所]),'郡',1)=0; クエリ1と2では集計数が異なっています。 その差は、Instr関数でテストする前に事前変換しているか否かです。 '市'、'区'、'郡'が本来の意味で使われている住所だけであれば BX関数は不要です。 しかし、そのように都合のよい住所ばかりではないです。 そういう事で、どうしてもBX関数の類が必要だと思います。 Public Function BX(ByVal TEXT As String) As String TEXT = Replace(TEXT, "郡山郡", "01_こおりやま郡") TEXT = Replace(TEXT, "市川市八幡", "市川市02_八幡町") TEXT = Replace(TEXT, "市川市", "03_いちかわ市") TEXT = Replace(TEXT, "町田市", "04_まちだ市") TEXT = Replace(TEXT, "小郡町", "05_おごおり町") BX = TEXT End Function なお、この'市'、'区'、'郡'が本来の意味で使われていない住所一覧はテキストファイルで定義しておくのがお勧め。 関数の中に変換データを埋め込むのはマジックナンバーの埋め込みと言われる最悪の手法。 しかも、テキストファイル化すればテキストファイルを追加・変更するだけで徐々に万全の仕組みになります。 100件やそこらですと瞬時に読み込んで事前変換できます。 そういう方向性を前提とした回答です。
お礼
ありがとうございます。 とても助かりました。