抽出条件の書き方とは?

このQ&Aのポイント
  • クエリの抽出条件の書き方を教えてください。
  • 支店ごとの上位2レコードを抽出したいです。
  • アクセスは2003です。
回答を見る
  • ベストアンサー

アクセス 抽出条件

いつもお世話になります。 次の条件で抽出したい時、クエリの抽出条件の書き方を教えてもらえますか。 支店CD 顧客CD 売上金額 昇順         降順 1     11     5,000 1     12     4,000 1     13     3,000 1     14     2,000 2     15     6,000 2     16     5,000 2     17     4,000 3     18     7,000 3     19     6,000 3     20     5,000 支店ごとの上位2レコードを抽出したいのです。下記のように 支店CD 顧客CD 売上金額 1     11     5,000 1     12     4,000 2     15     6,000 2     16     5,000 3     18     7,000 3     19     6,000 アクセスは2003です。よろしくお願いします。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

テーブルの名前がわからなかったので、 勝手に「T_売上」と命名させていただきました。 SELECT T_売上.支店CD, T_売上.顧客CD, T_売上.売上金額 FROM T_売上 WHERE ((((SELECT Count(*) FROM T_売上 AS T_TEMP WHERE (T_TEMP!支店CD =T_売上!支店CD) and (T_TEMP!売上金額 > T_売上!売上金額))+1)<=2)); こんな感じで上手いこと動かないかなぁ・・・と思うのですが、 是非お試しくださいませ。

WindsorAvenue
質問者

お礼

早速ご回答いただきありがとうございます。 ご教示いただいたSQL文でうまくいきました。 とても勉強になりました。ありがとうございます。

WindsorAvenue
質問者

補足

ちなみに、支店CD内に、売上金額が同額で上位1位の顧客がいた場合、その支店のレコードだけ3レコード抽出になってしまいました。この場合、単純にレコード上位2レコードを抽出する場合、どうしたらいいでしょうか。勉強不足ですいません。

その他の回答 (2)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

テーブル名を「TH」と仮定します。 クエリのSQLビューで以下を記述してみます。 SELECT * FROM TH AS Q1 WHERE 顧客CD IN (SELECT TOP 2 顧客CD FROM TH WHERE 支店CD=Q1.支店CD ORDER BY 売上金額 DESC) ORDER BY 支店CD, 売上金額 DESC, 顧客CD; この表示結果は、補足にあるように同じ額の「売上金額」があると上位2つ限定にはなりません。 ここで、以下のように変更してみます。 SELECT * FROM TH AS Q1 WHERE 顧客CD IN (SELECT TOP 2 顧客CD FROM TH WHERE 支店CD=Q1.支店CD ORDER BY 売上金額 DESC, 顧客CD) ORDER BY 支店CD, 売上金額 DESC, 顧客CD; 上位2つを得る時に「顧客CD」を ORDER BY に追加してやります。 同じ額の「売上金額」で並んだ場合、「顧客CD」昇順で上位2つを取るようになります。 ※ 何故かはわかりません。わかったら教えてください。 ※ やってみるとそういう動きみたいです(2007にて)

WindsorAvenue
質問者

お礼

ご回答いただきありがとうございます。 >※ やってみるとそういう動きみたいです(2007にて) 2003でもそうなりました!何故だかわかりませんが…(^^; 助かりました。ありがとうございましたm(_ _)m

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

> 売上金額が同額で上位1位の顧客がいた場合、 > その支店のレコードだけ3レコード抽出になってしまいました。 常識的に「同率一位」が3人いるなら、金メダルは3つ用意しますよね? 当然の挙動です。 > この場合、単純にレコード上位2レコードを抽出する場合 アクセスには「レコードの格納順」と言う考え方は無いと思う方が良いです。 前後バラバラに保存されているレコードを寄せ集めてきて 適宜並べ替えて表示しているだけです。 なので、それをやるのであれば、データに連番を重複無しで付け、 コレをキーにして、同じやり方でやると良いと思いますよ。

WindsorAvenue
質問者

お礼

>常識的に「同率一位」が3人いるなら、金メダルは3つ用意しますよね? >当然の挙動です。 仰るとおりで常識的に考えると3レコード抽出が正しいです。売上金額の上位よりもレコード数が2つという事に重きがあるため、困ってしまいました。説明不足でしたね。 >アクセスには「レコードの格納順」と言う考え方は無いと思う方が良いです。 そうなんですね。まだまだ勉強不足です(>_<) 教えていただきありがとうございました。

関連するQ&A

  • Accessのレコード抽出条件

    Accessのレコード抽出条件がありますが、降順、昇順にしか分けられないのでしょうか? 例;あ市とか市、さ市、わ市とあったとして、あ市とわ市、後はあいうえお順(降順)で分けることはできないのでしょうか?常に降順としてしか振り分けできないのでしょうか?

  • アクセスVBA TOP値を変数

    フォーム内テキストボックスの数値を、SELECT TOP の変数にしたくて、コマンドボタンを押した時に、下記VBAを書いたところ、実行時エラー7874 と出て、下から2行目でエラーとなりました。 Private Sub command1_Click() Dim 抽出数 As Integer Dim mySQL As String 抽出数 = Me![text1] mySQL = "SELECT * FROM T_1 AS Q_TEMP WHERE 顧客CD in (SELECT TOP " & 抽出数 & " 顧客CD FROM T_1 WHERE 支店CD=Q_TEMP.支店CD ORDER BY 売上金額 DESC,顧客CD) ORDER BY 支店CD, 売上金額 DESC , 顧客CD;" DoCmd.OpenQuery mySQL End Sub やりたい事は、テーブル:T_1に下記レコードがあり、各支店ごとのトップ売上金額2を抽出したいのと、トップ2を変数にしたいのです。 支店CD 顧客CD 売上金額 1 11 1,000 1 12 2,000 1 13 3,000 1 14 4,000 2 15 2,000 2 16 3,000 2 17 4,000 2 18 5,000 3 19 5,000 3 20 5,000 3 21 5,000 3 22 5,000 を、上記SQL文で、下記の結果にしたい 支店CD 顧客CD 売上金額 1 13 3,000 1 14 4,000 2 17 4,000 2 18 5,000 3 19 5,000 3 20 5,000 (売上金額が同じなら、顧客CDの小さい方から2つ) どこが間違っているか教えてもらえますか?

  • アクセス 複数条件の抽出~出力について

    ■アクセスのフォームにて、複数の条件を入力し、合致するリストをエクセルで出力する   データベースを構築しようとしています。  ⇒この複数の条件を入力する件に関し質問です。 ■目的は、顧客からのアンケート回答結果をDBから取出し、エクセルにて解析を行う事です。  情報量が膨大であるため、セグメントした形で出力し効率を上げたいと考えています。 ○テーブルのフィールド構造:   支店(テキスト型)、顧客No(数値型)、顧客名(テキスト型)、質問1(数値型)、質問2、・・・   ○フォーム「データ抽出」の構造: [支店名1][支店名2] [顧客No1][顧客No2] [顧客名1][顧客名2]       【出力ボタン】 ※上記テキストボックスいずれかに入力された条件に合致するデータが          【出力ボタン】を押すとエクセルに出力されるという構造です。          ※ボタンのイベントに「抽出マクロ」を設定。 ○抽出クエリ: 支店 [Forms]![データ抽出]![支店名1]  Is Null [Forms]![データ抽出]![支店名2]  Is Null 顧客No [Forms]![データ抽出]![顧客No1]  Is Null [Forms]![データ抽出]![顧客No2]  Is Null 企業名 like "*" &[Forms]![データ抽出]![顧客名1]& "*" Is Null like "*" &[Forms]![データ抽出]![顧客名2]& "*" Is Null               ○マクロ(抽出マクロ):  クエリを開く (抽出クエリ)  コマンドの実行(エクセルに出力)  閉じる (抽出クエリ) と設定しました。そこで実行確認すると・・・・  (例)     (1)支店名1だけに入力して、他は空欄で出力ボタンを押下。     ⇒条件セグメントされず、全てのデータがエクセル出力されてしまう。     (2)全ての項目に入力して出力ボタンを押下     ⇒条件セグメントされたデータがエクセル出力される。  という現象が起こりました。  例示(2)は良いとして、(1)の様な空欄がある状態でも、条件にマッチした出力をしたいのですが上手くいいかず困っています。    尚、クエリの抽出条件を支店フィールドだけにした所・・ 支店  [Forms]![データ抽出]![支店名1]   Is Null  [Forms]![データ抽出]![支店名2]   Is Nul 支店名1に入力して支店名2は空欄であっても条件にマッチした出力結果が得られました。 長文恐縮でございますが、どなたか解決法をご教授いただきたく存じます。よろしくお願いいたします。

  • アクセス クエリー 抽出条件について

    アクセス クエリー 抽出条件について たとえば文字列で5桁の仕入先コードフィールドが有るとします。で1と3と5を除くレコードを表示させたいときは 抽出条件をどの様に設定したらよろしいでしょうか?

  • Access 複数の抽出条件

    Access2002 windows2000 (例)次のようなテーブルとします。 フィールド名:名前 年齢 性別 レコード1 :山本 30 男 レコード2 :鈴木 40 女 レコード3 :田中 45 男 レコード4 :森本 26 女 クエリを利用して抽出する時、年齢が40以上で男を条件とすれば (1)年齢フィールドの抽出条件:>=40 (2)性別フィールドの抽出条件:男 として、田中が抽出されます。 では年齢が40以上で男、そして女は全て抽出したい時は(1)(2)の条件はどの様にすればいいでしょう? 抽出結果が 田中、鈴木、森本となりたいのです。 複数のクエリを作れば出来ますが、1つのクエリでは無理なのでしょうか。

  • Accessの選択クエリの抽出条件について

    いちもお世話になります。Access2002を勉強中の初心者です。 顧客テーブルから選択クエリを作っています。クエリのフィールドには「都道府県」(東京、埼玉、千葉...)と「顧客名」(山田、佐藤、田中...)があります。 「顧客名」の山田以外を抽出したいのですが、但し「都道府県」が東京の場合は山田以外の条件を外したいのです。つまり、埼玉、千葉の山田は抽出しませんが東京の山田は抽出したいのです。 このような抽出条件の設定ができますか? アドバイス、よろしくお願いします。

  • ACCESS2000 クエリの抽出条件

    フィールドに無作為に年月日が入力されているとします。 クエリの抽出条件に>2008/1/1と入力すると「2008年1月1日よりも新しい日付のレコード」を選択できます。 新しい日付の上位25までを選択するためには、抽出条件になんと入力したらいいのでしょうか。あまりにも基本的な質問かもしれませんが、お時間の許す方にお願いします。

  • ACCESSクエリーの抽出条件について

    OS WIN7 ACCESS 2007使用です。 クエリーの抽出条件について何ですが、テーブルにコードというフィールドがありまして、そこには数値が入力されています。 コード 1 2 3 4 5 ・ ・ このテーブルを元に選択クエリーを作りたいのですが、条件としてコードの値に2と3両方がある場合、2のレコードだけを表示せず、どちらか一方の数値だけの場合またはどちらもない場合は、全てのレコードを表示するようにしたいのです。 抽出条件はどのように書けばよいのでしょうか? いろいろ試したのですが、うまくいきません。 どなたかお助け下さい。

  • ACCESS クエリの抽出条件

    毎度お世話になります。 クエリをレコードソースとするフォームから、コマンドボタンでアクションクエリを実行するときの抽出条件の書き方を教えて頂けないでしょうか? 二つのテーブル(別のACCESSファイルからリンク)を基にパラメータクエリを作っています。 そのクエリを基にフォームを作っています。 さらに、そのフォームに追加クエリを実行するボタンを置いています。 フォームに表示してあるレコードだけ(パラメータで抽出されたレコードだけ)、他のテーブルに追加しようと思っているのですが、実行ボタンを押すともう一度パラメータが出てきてしまいます。 多分テキストボックスの値を読み取る際にレコードソースがテーブルでないのが問題じゃないかと思うのですが。。。 テーブル:Container / Items クエリ:From_Con(パラメータは[Container]フィールド) フォーム:From_Con(テキストボックス名は[txtContainer]) 追加クエリ:From_Con_App(抽出条件は[Forms]![From_Con]![txtContainer]としてみたがうまく動きません。) デザインビューの抽出条件を使う方法? SQLを使う方法? QueryDefを使う方法? いろいろありそうですが、ネットで検索してもヒットしません。 分かりにくい説明で申し訳ありませんがご教授願います。

  • Access 抽出条件

    クエリの抽出条件で特定のレコードを抽出したいのですが 最新の三年分のレコードデータを抽出する場合どのような式にすればよいのでしょうか? テーブルには年月フォームがあり年月が入力されています。

専門家に質問してみよう