• ベストアンサー

複数条件で抽出したいのですが上手くいきません

テーブルAには「注文番号」「注文者」「金額」「発注日」「出荷日」があります。(約20000件) テーブルBには「金額」「出荷日」があります。(約500件) これら2つのテーブルから、「金額」と「出荷日」が一致するものを抽出したいのですが、 選択クエリで「金額」と「出荷日」を繋いで実行しても抽出できません。 それぞれを別に実行するとできます。ただ、「金額」も「出荷日」も同じ金額と出荷日が多数あるため、500件を遥かに越えた数字になってしまいます。 (6000件とか) それが問題でしょうか? お手数ですが、回答頂ければと思います。

質問者が選んだベストアンサー

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.5

>テーブルBと上記不一致のリストを比較し金額は一致かつ出荷日も一致もしくは日付が近いレコードを抽出したい 日付が近いというのはあいまいですね。これは金額・出荷日が一致するレコードの修正が終わった後やるしかないと思います。 簡単にやるにはまずテーブルAの選択クエリを作りテーブル追加でテーブルBを追加し金額と出荷日をドラッグし結合します。この状態で金額と出荷日が一致するレコードを抽出するクエリが出来ます。 そのクエリを元に注文番号の不一致クエリを作ります。 これで出来ます。 例えば金額と出荷日が一致するレコードを抽出するクエリを作りクエリ1とすると不一致クエリは SELECT [クエリ1].注文番号, [クエリ1].金額, [クエリ1].出荷日 FROM [クエリ1] LEFT JOIN テーブルB ON [クエリ1].注文番号 = [テーブルB].注文番号 WHERE ((([テーブルB].注文番号) Is Null)); となります。 これで金額・出荷日が一致していて注文番号が一致していないレコードを抽出できます。

kumafukuro
質問者

お礼

抽出できました。ありがとうごさいます。 あとは注文番号を目視で修正していきます。 お忙しいところ色々とありがとうごさいました。

その他の回答 (4)

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.4

>2つのテーブルから、「金額」と「出荷日」が一致するものを抽出したい >ただ、「金額」も「出荷日」も同じ金額と出荷日が多数あるため500件を遥かに越えた数字 注文番号(重複なしとすれば)が一致するものを抽出すれば当然500件以下で金額と出荷日で抽出をすれば「金額」も「出荷日」も同じ金額と出荷日が多数あればその全てのレコードをテーブルAから抽出するので500件を超えてもおかしくはない。 テーブルA         テーブルB 注文番号 金額 出荷日  注文番号 金額 出荷日 1    \1000 06/04/01   1 \1000 06/04/01 2    \1000 06/04/01 3    \1000 06/04/01 この場合、注文番号が一致するのは1件、金額・出荷日が一致すするのは3件なので抽出をすれば3件とも抽出されてしまうのでテーブルBの1レコードに対してテーブルAの3レコードが該当してしまうのでテーブルBのレコード数より多くなります。 WHERE条件で言えば WHERE ((([テーブルA].注文番号)=[テーブルB]![注文番号]) AND (([テーブルA].金額)=[テーブルB]![金額]) AND (([テーブルA].出荷日)=[テーブルB]![出荷日])) OR ((([テーブルA].注文番号)<>[テーブルB]![注文番号]) AND (([テーブルA].金額)=[テーブルB]![金額]) AND (([テーブルA].出荷日)=[テーブルB]![出荷日])); の状態です 他の方が正規化云々とありますがそれより >「注文番号」で一致すれば一番いいのですが、番号が間違っている可能性があるため これが一番の問題。キーとして役に立っていない。テーブルAとテーブルBの注文番号の整合性が取られていないのでご希望の抽出ができない。 #1の方の言うようにテーブルBにもっと一意として使えるフィールドがないと正確な抽出は出来ません。 注文番号・金額・出荷日が一致しないレコードを抽出してそのレコードの注文番号を修正するようにしテーブルAとテーブルBの注文番号を一意のキーとして使えるようにするしかないと思うのですが。

kumafukuro
質問者

補足

回答ありがとうございます。 皆様の仰るとおり、「注文番号」の一致しないレコードを抽出しテーブルBの「注文番号」を修正したいです。 そのために、テーブルBと上記不一致のリストを比較し、「金額」は一致、かつ「出荷日」も一致、もしくは日付が近いレコードを抽出したいのですが、そのようなことはできるのでしょうか?

noname#60992
noname#60992
回答No.3

そのようなことをするためには、ADOなどを使用する必要がありますが (1) 注文番号が一致しないもののリストを作り、仮テーブルに保存する。 (2) 仮テーブルのレコードを一件ずつテーブルAと照合させ該当レコードを見つけ出し、テーブルBの注文番号を修正する。 (3) 仮テーブルを削除する。 のような手順を踏まれたらいかがでしょうか?

  • crazy_dog
  • ベストアンサー率37% (148/391)
回答No.2

こんにちは No.1さんがおっしゃるとおり、このテーブルBは一体何の意味があるテーブルなんでしょうか? 注文番号一つに商品が一つという関係であるなら、テーブルBは全く意味がありません。 データベースでは、「テーブルの正規化」といわれるテーブルの分割を行ないますが、意味のないところで分けてしまっては、データ自体のつながりがなくなってしまいます。 データのつながり自体をよく考えて「テーブルの正規化」を行なってください。 よろしければ、参考URLをご覧になられてはいかがですか?

参考URL:
http://www.mahoutsukaino.com/
kumafukuro
質問者

補足

皆様にはお忙しいところご回答頂き感謝しております。説明不足で大変申し訳ありません。 テーブルBには「注文番号」、「注文コード」 などもあります。業者から出荷データとしてもらいます。 作業としては (1)「注文番号」で一致させる。 (2)一致しなかったものを「金額」と「出荷日」で一致させる。 上記(2)の作業が上手くいかないため、(1)の記述を省きました。 「注文番号」で一致すれば一番いいのですが、番号が間違っている可能性があるため、次の条件が(2)になるので、それで検索をしたいのです。 選択クエリでのやり方が間違っていないのであれば、両方に一致するデータがないだけなのかもしれません。 操作が間違っているのか、データがないのか判断ができなかったので、操作方法をお伺いしたく質問した次第です。

noname#60992
noname#60992
回答No.1

テーブルBは何のデータを入れるためにあるのですか? 金額も、出荷日もテーブルAに入っていますよね。 テーブルBにもう少し、レコードを限定させる条件(注文者、注文番号)が必要と思います。 どういうデータの保存の仕方を行っていて、何を抽出したいかがはっきりと理解できれば的確なアドバイスも集まると思います。 

関連するQ&A

  • Access クエリ 抽出・演算

    Access クエリについてご質問させていただきます。 テーブルのデータを特定の条件に一致するレコードだけ抽出し、演算を実施したいです。 (1):CSVデータをテーブルに取り込みます。 テーブルは左から『取引No』『部門コード』『部門名』『発注入力日』『担当者名』『発注日』『伝票No』『伝票行No』『商品コード』『商品名』『入数』『発注数(入力数)』『発注数量※1』『発注金額※2』『出荷日』『出荷数量※3』『出荷金額※4』となっております。 ※1:発注数量は入数×発注数が計算済みです。 ※2:発注金額は発注数量×単価で小数点以下切り捨てで計算済みです。 ※3:出荷数量は入数×出荷数が計算済みです。 ※4:出荷金額は出荷数量×単価で小数点以下切り捨てで計算済みです。 (2):クエリを使用して、商品名が『単3乾電池』の出荷数量を10で割り、10で割り切れるレコードを求めたいです。 (3):(2)の演算結果(10で割った後の整数)を合算して合計値をクエリの演算結果として表示したいです。 ※(2)の抽出条件でのクエリをすでに作成済みで、合計したクエリを作成したいです。 どのようにすればよろしいでしょうか?

  • Access クエリ 抽出条件

    Access の クエリ における 抽出条件 の 書き方についてご質問させていただきます。 クエリには、左から『商品名』、『出荷数量』、『注文数量』の3列がございます。 各レコードの『出荷数量』フィールドの値と『注文数量』フィールドの値を比較し、 『注文数量』フィールドの値の方が大きいレコードだけを抽出したいのですが、どのように抽出条件を記載すればよろしいでしょうか? 元データは1つのテーブルに格納されています。 例:注文数量:500、出荷数量:200など出荷数量が少ないレコードを抽出対象 注文数量:100、出荷数量:100など注文数量=出荷数量レコードは抽出対象外

  • acccess:クエリの抽出条件

    助けてください_(._.)_ アクセスの選択及び更新クエリで あるテーブル「t_抽出」の「社員番号」フィールドと一致したレコードのみ選択して情報を更新したいのですが。 式ビルダを使ってで抽出条件のところに [t_抽出]![社員番号] と入れるのですが 実行するとパラメータが出てくる どうして?何がいけないのでしょうか(・・? どうぞよろしく

  • Accessレポート 複数条件での集計

    どなたかお知恵をお貸しください。 テーブル名:T_当社 フィールド:商品管理番号(テキスト)、入庫日(日付)、数量(数値)、金額(数値)、伝票番号(テキスト) テーブル名:T_取引先 フィールド:商品管理番号(テキスト)、入庫日(日付)、数量(数値)、金額(数値) クエリ名:Q_商品一致 元テーブル:[T_当社]、[T_取引先] フィールド:商品管理番号(テキスト)、入庫日(日付)、数量(数値)、金額(数値)、伝票番号(テキスト) 抽出条件:[当社]テーブルの[商品管理番号]と[取引先]テーブルの[商品管理番号]が一致するものだけ データベース構成は以上の通りです。下記のようなレポートを作成したいのです。 条件1:[入庫日]を月単位でグループ化し、[数量][金額]を集計する。----- レポート上の表示項目名[数量][金額] 条件2:[伝票番号]の値が[3U]で始まるものと、[3N]で始まるものは、 条件1の[数量]と[金額]から差し引いて、別列に表示させる。 ※3U、3Nのデータに関しては、[0]が表示されず、空白でもOK。 自分でしたのは、下記の通りです。 1.Q_商品一致クエリで、[伝票番号]が、3Uと3Nで始まるレコードを除外。 2.Q_商品一致クエリを元に、[伝票番号]が、3Uで始まるレコードだけを抽出するクエリ[Q_3U]を作成。 3.Q_商品一致クエリを元に、[伝票番号]が、3Nで始まるレコードだけを抽出するクエリ[Q_3N]を作成。 4.Q_商品一致クエリを元に、[入庫日]でグループ化したクエリ[Q_商品一致(月別)]を作成。  Q_3U、Q_3Nも同様に、[入庫日]でグループ化したくエリを作成。 (4)で作成した3つのクエリを、1つの選択クエリにしてみたのですが、これだと、例えば、 4月度にしか[3N]データがない場合でも、5月度以降の行にも、4月度の[3N]データの値が繰り返し表示されてしまいます。

  • ACCESSのクエリ:抽出条件で型が一致しません

    ACCESSでクエリを作ったのですが 実行すると、 「抽出条件で型が一致しません」のエラーが出ます 問題となっているヶ所は テーブルのフィールド定義がバイナリーになっています そして、クエリで   フィールド   テーブル   並べ替え   表示   抽出条件   または となっていますが、 この抽出条件に、1、を入れました テキスト型なら、"1" 数値系型なら、1、でいいのか、と思ったのですが バイナリ型は別の表現があるのでしょうか よろしくお願いします

  • 範囲設定のある条件に対する抽出について

    下記の様に二つのテーブルがあります。1つのテーブルにコード範囲と箱番号が設定されており、もうひとつのテーブルに商品コードが入っています。例えば、発注テーブル1:IDの1と2は、商品テーブル1のコード開始番号とコード終了番号でみると箱番号のレコード1の範囲に入っているので、商品テーブル1:箱番号”1”を抽出。このように対応している箱番号を発注テーブルを基準に、それぞれ抽出したい場合はどうしたらよいのでしょうか? 判り難くて申し訳ないのですが、よろしくお願いします。 ex テーブル1:商品テーブル1 箱番号,コード開始番号,コード終了番号 1,1000001,1000100 2,1000101,1000300 3,1000301,1000350 テーブル2:発注テーブル1 ID ,商品コード 1,1000005 2,1000017 3,1000213

  • フォーム上での複数条件での抽出ができません

    工事の発注した年度と月をコンボボックスでそれぞれ入力した値で 抽出したいと思いましたが、なかなかうまくいきません。 Private Sub 抽出ボタン_Click() Me.FilterOn = False '抽出ボタンをクリックしたらcbo年度コードの値でフィルターをかける Me.Filter = "年度 = " & Me![cbo年度] And "発注予定 = " & Me![cbo月] 'フィルターを実行します。 Me.FilterOn = True End Sub 別のプロシージャで年と月を別々に抽出することはできたのですが、 「○年のさらに○月の工事」と絞り込むことができずに困っています。 このプロシージャを実行すると、以下のエラー分が表示されます。 ========================= 実行時エラー '13': 型が一致しません。

  • SQLでの抽出条件

    SQL初心者です。初歩的な質問だと思いますが、ご教授願います。 以下のような2つのテーブルがあります。 【テーブルA】 グループ 社員番号 A 1 A 2 A 3 B 4 B 5 B 6 C 7 C 8 D 9 D 1 【テーブルB】 社員番号 1 9 テーブルBの社員番号と一致する場合、テーブルAをグループ単位で抽出しないようにしたいです。  ・グループAは社員番号1が一致するため抽出しない。  ・グループDは社員番号1と9が一致するため抽出しない。 【取得結果】 グループ 社員番号 B 4 B 5 B 6 C 7 C 8 説明が分かりづらくて申し訳ありませんが、よろしくお願い致します。

  • クエリの抽出条件について教えて下さい

    テーブルA 商品名   発注数  発注日      金額 AAAAA    1      2007/10/1  \\\\ AAAAB    20     2007/11/14   \\  AAAAA  15      2007/11/19  \\\\ AAAAA  15      2007/11/20   \\\\ AAAAA   6      2007/11/30  \\\\ AAAAA   28      2008/12/1  \\\\ AAAAA   2      2008/12/15   \\\\ クエリA (商品AAAAAの月間発注数の合計) 発注数合計 発注月 1      2007/10 36     2007/11 30     2007/12 というところまでクエリで出来たのですが、これを毎月自動的に先月分だけ表示するようにしたいのですがどうすればよいでしょうか? 初歩的な質問で申し訳ございませんが、初心者なのでなるべく簡単な方法を教えて下さい。宜しくお願い致します。     

  • Accessの不一致クエリについて

    Accessの不一致クエリについて質問があります。 ある注文リストと商品マスタを比べ、 まずテーブル作成クエリで注文リストとマスタを比べ、常備品(商品マスタにある)は出荷日に本日日付をセットしテーブル作成、次に不一致クエリでマスタにない特注品は空欄のまま先程作成したテーブルに追加をするマクロを作成しました。 すると、注文が100件、特注が2件だった場合、最初は98件が作成されますが、不一致クエリをやっても0件になります。 ちなみに商品マスタには、商品コードと3種類の規格があり、注文リストの商品コード+規格を連結、商品マスタのそれを連結させて、一致か不一致かで見ています。 不一致がどうしても0件になるのですが、解決方法はないでしょうか。 お願いします。

専門家に質問してみよう