プロが教える店舗&オフィスのセキュリティ対策術

複数クエリのデータをまとめるには?

Accessで以下のようなクエリが複数あります。

クエリ:○×町
 name ○×町面積
 ○×町 123

クエリ△△町
 name △△町面積
 △△町 567


これを以下のようにまとめる方法があるでしょうか?

 name 町面積
 ○×町 123
 △△町 567

Access初心者です。
どのような機能があるのかまだよく分かっていませんのでよろしくお願いします。

A 回答 (8件)

クエリでは実現できないデータのまとめかた


なので、以下のようにプログラムを組む
必要があります。

各クエリがたとえば、
クエリ:○×町-A
 name ○×町面積
 ○×町 123
が、
クエリ:○×町-A
 name ○×町面積
 ○×町 123
 ○×町 259
 ○×町 393
のようにまだデータを取る場合は
また、違う方法をとらなければなりませんが、
各クエリが提示されたようにレコードが一つ
ならば、以下のようになります。
ただし、フィールドの並びが、
 name ○×町面積
のようになっていることが条件です。

(1)
データを収めるテーブルを一つ用意します。
テーブルの名前を、T面積
フィールドの名前を、名称、町面積A、町面積B
とします。尚、nameという名称はコードの中では
いろいろと面倒なことが起きる名称なので、
クエリのnameという名前は名称とします。
したがって、各クエリのnameのところを、デザインビューで、

名称:name

としてください。
なお、T面積の各フィールドの型のテキスト型、数値型
などは、そちらのデータにあわせてください。

(2)
新規のフォームにボタンを作り、以下のコードを
フォームのコード表に張り付けて保存してください。

Private Sub コマンド0_Click()
Dim db As Database
Dim qdf As QueryDef
Dim rs As Recordset
Dim rsqA As Recordset
Dim rsqB As Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset("T面積", dbOpenDynaset)

'登録されているクエリを検索
For Each qdf In db.QueryDefs
'先にクエリの名前の末尾2字が-Aとなっているクエリを検索
If Right(qdf.Name, 2) = "-A" Then
Set rsqA = db.OpenRecordset(qdf.Name, dbOpenDynaset)
If rsqA.RecordCount > 0 Then
rsqA.MoveFirst
'クエリのデータをテーブルに格納
Do Until rsqA.EOF
rs.AddNew
rs!名称 = rsqA!名称
rs!町面積A = rsqA.Fields(1)
rs.Update
rsqA.MoveNext
Loop
End If
rsqA.Close: Set rsqA = Nothing
End If

'クエリの名前の末尾2字が-Bとなっているクエリを検索
If Right(qdf.Name, 2) = "-B" Then
Set rsqB = db.OpenRecordset(qdf.Name, dbOpenSnapshot)
If rsqB.RecordCount > 0 Then
rsqB.MoveFirst
Do Until rsqB.EOF
'格納先のテーブルを検索
rs.MoveFirst
Do Until rs.EOF
'格納先の名称と同じものがクエリに存在するか検索
If rs!名称 = rsqB!名称 Then
'クエリのデータをテーブルに格納
rs.Edit
rs!名称 = rsqB!名称
rs!町面積B = rsqB.Fields(1)
rs.Update
rsqB.MoveNext
End If
rs.MoveNext
Loop
Loop
End If
rsqB.Close: Set rsqB = Nothing
End If
'検索のため次のクエリに移動
Next qdf

rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
End Sub

各クエリのデータが一件づつというのは、
余りにも非効率な気がします。、
このようなデータの取り方をしなければ
ならない事情があるならば別ですが、
もしデータが大量にあってこのような
クエリを大量につくらなけらばならないのならば
何をどのようにしたい、ということがわかれば
プログラムだけ、あるいは少しのクエリと
プログラムの組み合わせで十分対応できるのでは
と思います。

なお、提示したプログラムはあくまでも各クエリが
データを一件づつしかもたない場合に限定されます。
一件ではない場合は、クエリの作り方とコードを
変更する必要があります。そのあたりは、いかがですか。
    • good
    • 0
この回答へのお礼

お礼が遅くなって申し訳ありません。
教えていただいたこと実現できました、ありがとうございます。
やりたいことが少し複雑になるだけで、こんなにいろいろと
手数が必要になるのですね。
初心者の私には、教えていただいたことを実現するのが精一杯
で、とても自力でできるほど理解できていません。^^;
教えていただいたおかげで、Accessの理解が少し深まりました。
何度も回答いただきまして、本当にありがとうございました。

お礼日時:2010/11/17 17:41

#7です。


コードをフォームのコード表に貼り付け保存した後、
コード表のツール→参照設定から、
Microsoft DAO xx Object Libraryにチェックを入れて
ください。xxは3.6のような数字です。xxは一番数値が
高いものを選択してください。なお、
Microsoft ActiveX Data Objects xx Libraryにチェックが
入っていたらはずしてください。
    • good
    • 0

#5です。

あるいは、

クエリ:○×町-A
 name ○×町面積
 ○×町 123

クエリ:○×町-B
 name ○×町面積
 ○×町 345

クエリ:△△町-A
 name △△町面積
 △△町 567

クエリ:△△町-B
 name △△町面積
 △△町 789

ということでしょうか。
それから、補足のまとめは、

 name 町面積A 町面積B 町面積C 町面積D
 ○×町  123  345 365 698
 △△町  567  789  244 983

のような事にもなるのでしょうか。あるいは、

 name 町面積A 町面積B
 ○×町  123  345
 △△町  567  789
 ○△町  698  423
  ・
  ・

のようになるのでしょうか。

この回答への補足

クエリ:○×町-A
 name ○×町面積
 ○×町 123
クエリ:○×町-B
 name ○×町面積
 ○×町 345

クエリ:△△町-A
 name ○×町面積
 △△町 567

クエリ:△△町-B
 name ○×町面積
 △△町 789

が正しいです。スミマセンでした。^^;

 name 町面積A 町面積B
 ○×町  123  345
 △△町  567  789
 ○△町  698  423

というようにできれば、と思っています。

補足日時:2010/10/29 10:14
    • good
    • 0

補足の、



クエリ:○×町-A
 name ○×町面積
 ○×町 123
クエリ:○×町-B
 name ○×町面積
 ○×町 345

クエリ:△△町-A
 name ○×町面積
 ○×町 567

クエリ:△△町-B
 name ○×町面積
 ○×町 789

は、

クエリ:○×町-A
 name ○×町面積
 ○×町 123
クエリ:○×町-B
 name ○×町面積
 ○×町 345

クエリ:△△町-A
 name ○×町面積
 △△町 567

クエリ:△△町-B
 name ○×町面積
 △△町 789

ではないのですか?

また、補足のデータが少ないので、データが増えたとき

 name 町面積A 町面積B
 ○×町  123  345
 △△町 567  789

がどのように変化するのかわからないので、
補足の各クエリのデータを3つくらい増やして、
まとめたデータがどのようになればいいのか
示してみてください。ある程度データがあれば
出来るか出来ないかがわかります。
    • good
    • 0

クエリは仕組みであって、結果は具体的に見えているものの、ファイルになっていない。


クエリをテーブル化する操作があるので一旦ファイルにして統合する方法もある。
またファイル・テーブルをVBAなどで統合するなら出来る。
ーー
(1)少ない(20-30までか)町村数なら、SQLビューのSQL文の中に条件で IN (・・・)
に羅列する。SQL分の書き換えになります。
(2)SQL文の条件をORで書き連ねて結ぶ。
またはデザイングリッドで条件にOrで超尊町村数だけ書き連ねる
(3)同じようなことでUNION句を使いSQL文を書き連ねる
SQL UNIONで照会
http://sql.1keydata.com/jp/sql-union.php
SQL INで照会
http://sql.1keydata.com/jp/sql-in.php
ーーー
多くなれば、これら条件をその都度プログラムでセットし直してプログラムで実行する。
または検索プログラムで、該当結果を1つのファイルに累積していく。
ーー
>Access初心者です、なら後半のプログラムは無理として、SQL文を変更書き込みも出来るかな。
    • good
    • 0
この回答へのお礼

スミマセン。
本当に初心者ですので、書いていただいたことについて行けませんでした。
また、もう少し理解が深まったら、書いていただいたこと見直してみようと
思います。
ご回答ありがとうございました。

お礼日時:2010/11/17 17:43

もう一度訂正。

何度もすみません。

SELECT クエリ○×町.name, [クエリ○×町]![○×町面積] AS 町面積
FROM クエリ○×町
UNION SELECT クエリ△△町.name, [クエリ△△町]![△△町面積] AS 町面積
FROM クエリ△△町;

です。

FROM ○×町

ではなく、

FROM クエリ○×町

でした。

この回答への補足

以下の方法もご存知でしょうか?

クエリ:○×町-A
 name ○×町面積
 ○×町 123
クエリ:○×町-B
 name ○×町面積
 ○×町 345

クエリ:△△町-A
 name ○×町面積
 ○×町 567

クエリ:△△町-B
 name ○×町面積
 ○×町 789

これを以下のようにまとめる方法があるでしょうか?

 name 町面積A 町面積B
 ○×町  123  345
 △△町 567  789

補足日時:2010/10/25 14:48
    • good
    • 0

#1です。



クエリのSQL文の中で、

SELECT クエリ○×町.name, [クエリ○×町]![○×町面積] AS 町面積
FROM ○×町
UNION SELECT クエリ△△町.name, [クエリ△△町]![△△町面] AS 町面積
FROM クエリ△△町;

以下の、

[クエリ△△町]![△△町面]

のところを

[クエリ△△町]![△△町面積]

にしてください。「積」が抜けていました。したがって、

SELECT クエリ○×町.name, [クエリ○×町]![○×町面積] AS 町面積
FROM ○×町
UNION SELECT クエリ△△町.name, [クエリ△△町]![△△町面積] AS 町面積
FROM クエリ△△町;

になります。このクエリの作り方は、新しいクエリを
デザインビューで開き、SQLビューに変更して、
上記のSQL文をコピーし、貼り付け適当な名前で
保存します。
    • good
    • 0

クエリ名が



クエリ:○×町


クエリ△△町

のように統一されていないので、こちらで
それぞれ、

クエリ○×町
クエリ△△町

としました。ユニオンクエリを使います。

SELECT クエリ○×町.name, [クエリ○×町]![○×町面積] AS 町面積
FROM ○×町
UNION SELECT クエリ△△町.name, [クエリ△△町]![△△町面] AS 町面積
FROM クエリ△△町;

二つのクエリのそれぞれの面積のところを町面積
に名前を付け替えて表示し、二つのクエリを
結合させます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!