AccessVBAで作業しています。
テーブル1の中に、A・B・C・D・E・Fという数値型のフィールドがあり、レコード数は6万件とします。
A=100 B=50 のA~Fのレコードをまず取り出し、
 レコード件数が1件ならF列の値を表示、
 レコード件数が複数ならC列の最大値を含むレコードを選択。
  それでレコード件数が1件ならF列の値を表示。
  それでもレコード件数が複数ならDの最大値を含むレコードを選択。
   それで件数が1件ならF列の値を・・・
   それでも複数件ならE列の最大値を・・・
と続きます。
そのたびに元のテーブル1から選択してくるのは効率が悪い気がします。
みなさんはどのように処理されるのでしょうか。
また、レコードセットを使用したSQLの書き方がわからず困っています。
どなたか教えていただけませんか? 何卒よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

私的方法


1.AとBの条件でFとFのカウント値を取る
2.1の結果がFのカウント値が1ならFの値を取る
→ここで処理終了
3.AとBの条件でCとCのカウントとFの最大値を取ります。この時Cの降順にソートします。グループ化すると言うことですよ。
4.3の結果の1件目のCのカウント数が1ならFの最大値を取る
→ここで処理終了
5.以下Dに対して、Eに対して・・・同文

て方法が簡単ですね

通常ワークテーブルにCからFの値を入れてから上記の方法をすれば件数にもよりますが速い処理が可能となります。
SQL的には
INSERT INTO WKTBL (C,D,E,F)
SELECT C,D,E,F
FROM TRNTBL
WHERE A = 100 AND B = 50

その後はWKTBLにて処理をするこの時はA、Bの条件は不要。

レコードセットはpaz777さんので良いでしょう。
    • good
    • 0
この回答へのお礼

目が覚めた感じがします。私は随分難しいことを考えていたんですね。
「ソートをかけてグループ化」、思いつきもしませんでした。
良い方法を聞けて良かった。心から感謝します。
本当にありがとうございました。

お礼日時:2001/04/07 00:33

こんにちは。



少し質問があるのですが、
> レコード件数が複数ならC列の最大値を含むレコードを選択。
の時に「A=100 B=50」は抽出条件に入りますか?
もし入るのであれば、最初に「A=100 B=50」だけの条件で抽出したデータ
を別テーブル(例えばテーブル2)に格納したあとに別テーブルを元にし
て参照すれば、そんなには負荷はないように思うのですが・・・

Accessのバージョンが不明なのですが、2000か97でしたら以下に使用例を
明記します。これが正解って訳ではありません。他にも色々とやり方はあ
りますのでj279702さんもお勉強してみて下さい。

---------------------------------------------------------------------
'
Dim DBN As Database 'データベース定義
Dim SNAP As Recordset 'SnapShot用
Dim DYNA As Recordset 'Dynaset用
Dim SQLSTR As String 'SQL構文
'
'
' 検索SQL文を作成
SQLSTR = "" '↓ここにSQLを記入
SQLSTR = SQLSTR & "SELECT * FROM テーブル1"
SQLSTR = SQLSTR & " WHERE A = 100 AND B = 50"
'
' データベース接続
Set DBN = DBEngine.Workspaces(0).Databases(0)
Set SNAP = DBN.OpenRecordset(SQLSTR, DB_OPEN_SNAPSHOT)
Set DYNA = DBN.OpenRecordset("テーブル2",DB_OPEN_DYNASET)
'
' 検索結果
If SNAP.BOF = True Then
MsgBox "データはありませんでした。", 48, "検索結果"
SNAP.Close
DYNA.Close
Exit Function
Else
' データコピー
SNAP.MoveFirst
Do Until SNAP.EOF
DYNA.AddNew
DYNA("A") = SNAP("A")
DYNA("B") = SNAP("B")
DYNA("C") = SNAP("C")
DYNA("D") = SNAP("D")
DYNA("E") = SNAP("E")
DYNA("F") = SNAP("F")
DYNA.Update
SNAP.MoveNext
Loop
End If
SNAP.Close
DYNA.Close
---------------------------------------------------------------------
見当違いの回答でしたらごめんなさいです。
ではでは・・・
    • good
    • 0
この回答へのお礼

質問の仕方が悪くてすみませんでした。欲しかったお返事です。
今まで誰かに質問して、ここまで教えて頂いたことはありませんでした。
すごく感激しています。
レコードセットを保持するよりテーブルで作業すれば早い処理が出来るとは思っていませんでした。やはり勉強不足ですねぇ。これからも頑張ります。
本当にありがとうございました。

お礼日時:2001/04/07 00:39

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qレコード件数が0件なら印刷をしない。

おはようございます。
アクセス2000でVBAを書いています。
あるテーブル(テーブルA)を元にレポート(レポートB)を作成しました。テーブルAのレコード件数が0件の時、印刷をさせたくないのですが、うまく書けません。IF文で分岐したいのでよろしくお願いします。
ちなみにテーブルAには顧客ID、カナ氏名、漢字氏名等が入っています。

誰か、助けて~!

Aベストアンサー

一例として・・・

If DCount("顧客ID", "テーブルA") > 0 Then
'レコードがあるときの処理
Else
'レコードがないときの処理
End If

あるいは・・・

If DCount("顧客ID", "テーブルA") = 0 Then
'レコードがないときの処理
End If
'あとはそのまま続行

詳しくはヘルプで「DCount」を調べてください。

Qアクセスのレコード件数ではなくフォーム上に表示されたそれぞれの項目についての件数について。

アクセスで検査データを管理していますが、ひとつのフォーム上で複数の項目が表示されている中のそれぞれの項目の件数を調べたいのですが、どのような方法があるでしょうか。アクセスで初めて取り組んでいますので、関数とか利用の仕方を大まかでいいので教えてください。よろしくお願いいたします。

Aベストアンサー

用語が適切でないのでよく分からないところがありますが

項目って何なんでしょう?フィールド?
それともフィールド内の値?

1つのフィールドに陽性という値と陰性という値があって
それぞれをカウントしたいのなら

陽性カウント:Sum(IIf(フィールド名="陽性",1,0)
陰性カウント:Sum(IIf(フィールド名="陰性",1,0)

項目がフィールド名なら単純にCount関数を使用すれば
Nullを除いてカウントしてくれます

QAccess 初心者 テーブルの住所録→レポート帳票形式→A4用紙に6件レコード表示(3行2列)

初心者です。
Access2003でテーブルで住所録を作成しています。
目的は、その住所録で作成したデータを印刷し、封筒に貼るという作業をしたいのです。
今レポートの帳票形式で作成し、デザインビューの詳細で作成すると、A4に縦に3件の住所が表示されました。しかし、A4用紙右半分が空いている状態です。無駄なのでその部分にも印刷し、合計6件の住所をA4で印刷したいと思っています。

試した事:デザインビューの詳細に直接6件表示するように作成しましたが、同じ住所がA4用紙に印刷されます。
帳票形式がだめでしょうか?
何かアドバスでもなんでもよろしくお願いします。

VBAでプログラムした事ないのですが、単純な方法はないでしょうか?
本当によろしくお願いします。
今日中にこの作業を終わらせたいと思っています。

Aベストアンサー

作業は出来ましたか、既に回答済みですが、私のPC(Access2002)で確認しました。
オブジェクト レポートで新規作成をクリック
宛名ラベルウィザード をクリック、使用する住所のテーブル(クエリ)を選択
取り合えず 2列のものを選択してもOKですし、ユーザー定義でも大丈夫かと
次へで一枚のラベルに印刷したいフィールドを配置していけば大丈夫です。
印刷プレビューみながら、印刷位置の調整もできますよ。

Qアクセスで複数の列から数値の入ったレコードのみ選択して右隣のレコードを表示する方法がわかりません。

ACCESS 2003を使用しています。
1行につきA列B列C列のうちひとつの列に数値が入っています(3つとも入っていない場合もありますが2つ以上入っていることはありません)。数値が入っていないレコードはブランクです。
この時いずれかの列に入力されている数値を隣のD列に表示する方法がわかりません。
どなたかよろしくお願いいたします。

Aベストアンサー

フィールド1フィールド2フィールド3式1
--------------------------0
--------1----------------1
-----------------2--------2
3-------------------------3
-----------------4--------4
--------------------------0
ヅレルかも知れませんが、0,1,2,3,4・・・の列は、式1の列(フィールド)の値です。
式1は 式1: Val(nz([フィールド1]))+Val(nz([フィールド2]))+Val(nz([フィールド3]))
のような足し算でよいのでは。<ー2つ以上入っていることはありません)。という事情から。

Qフォーム上でレコードを抽出して最大値を求めたいのですが。

こんばんは。アクセスについておしえていただきたいのですが。フォーム上で、テーブル「在庫」の「カテゴリ」(例えば肉)を条件として絞り込んで、その中で「価格」の最大値を求めたいのですが、うまくいきません。というかわかりません。条件はテキストボックスに入力して、コマンドボタンを押すことにより最大値を求めたいのです。判る方がいらっしゃいましたら、教えていただきたいのですが。よろしくお願いします。(フォームは、テーブル「在庫」をもとに作られたフォームです。)

Aベストアンサー

#1です

> DMAXを使って最大値が取れればと・・・

関数名がわかっているのなら、ヘルプ等を参照した方が早いのでは?

3番目の引数に抽出するまでの条件を記述すればよいです。


人気Q&Aランキング

おすすめ情報