• ベストアンサー

Accessクエリ

お世話になります。 Access初学者です。 グループごとに日付が最大のレコードを、それぞれ1件抽出するクエリを作成したいと思っています。 IDを表示させなければできるのですが、IDを表示させると全レコードが抽出されます。どのようにすればいいのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.1

図の例なら、ID も「最大」にすれば良さそうですが、 必ずしも 日付の大きいものが ID も大きいとは限らないということ? その場合、「Access初学者」なら クエリを2個作るのが簡単です。 1つ目は 図の「クエリ」と書かれているもの。 次に 新しいクエリに「クエリ」と「テーブル」を追加し 「グループ」と「日付」をそれぞれ結合します。 「テーブル」の各フィールド、あるいは「*」を フィールド欄に設定して出来上がりです。

mihimarumaru
質問者

お礼

ありがとうございます。 日付の大きいものが ID も大きいとは限らないので、クエリを2個作り、「グループ」と「日付」をそれぞれ結合する方法がぴったりでした。非常に助かりました。

その他の回答 (1)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

下記に表示したSQL文をコピーし、クエリのSQLビューに 貼り付けて保存し、実行してみてください。 では、解説。 やり方はいろいろありますが、質問の場合に 同じグループ内で、日付が同じレコードが存在しないならば、 SELECT * FROM テーブル1 WHERE id= (SELECT TOP 1 id FROM テーブル1 AS Temp WHERE Temp.グループ = テーブル1.グループ ORDER BY 日付 DESC, id DESC ); でいいのですが、 同じグループで日付が最大でかつ同じ日付のレコードが 複数ある場合はどうするのかでやり方が異なります。 たとえば、以下のようにBグループのidが5と6が同じ日付で かつグループ内で日付が最大の場合は、抽出するときに 条件を考える必要があります。 id  グループ   日付 1    A    2022/11/03 2    A    2021/03/06 3    A    2022/01/01 4    B    2021/09/12 5    B    2022/01/01 6    B    2022/01/01 7    C    2022/11/09 8    C    2022/01/19 9    C    2020/12/06 10   D    2021/06/26 11   D    2019/06/22 12   D    2022/12/03 しかし、いずれにしてもサブクエリを使った 少々面倒な方法をすることになります。 1 すべて表示する場合は、 SELECT テーブル1.id, テーブル1.グループ, テーブル1.日付 FROM テーブル1 INNER JOIN (SELECT テーブル1.グループ, Max(テーブル1.日付) AS 日付 FROM テーブル1 GROUP BY テーブル1.グループ ) AS Temp ON (テーブル1.グループ = Temp.グループ) AND (テーブル1.日付 = Temp.日付) ORDER BY テーブル1.id ASC; このクエリを実行すると、 id   グループ   日付 1     A    2022/11/03 5     B    2022/01/01 6     B    2022/01/01 7     C    2022/11/09 12    D    2022/12/03 のように抽出されます。 なお 、 SELECT テーブル1.id, テーブル1.グループ, テーブル1.日付 のところを、 SELECT * とすると、余分なフィールドが表示されるのでフィールドを 特定しておきます。 2 idが一番大きい番号を表示する場合は、 SELECT * FROM テーブル1 WHERE id= (SELECT TOP 1 id FROM テーブル1 AS Temp WHERE Temp.グループ = テーブル1.グループ ORDER BY 日付 DESC, id DESC ); このクエリを実行すると、 id  グループ  日付 1    A   2022/11/03 6    B   2022/01/01 7    C   2022/11/09 12   D   2022/12/03 のように、Bグループで日付が最大の複数のレコードのうち idが一番大きい6が抽出されます。 3 idが一番小さい番号を表示する場合は、 SELECT * FROM テーブル1 WHERE id= (SELECT TOP 1 id FROM テーブル1 as Temp WHERE Temp.グループ = テーブル1.グループ ORDER BY 日付 DESC, id ASC ); このクエリを実行すると、 id  グループ   日付 1    A   2022/11/03 5    B   2022/01/01 7    C   2022/11/09 12   D   2022/12/03 のように、Bグループで日付が最大の複数のレコードのうち idが一番小さい5が抽出されます。 上記の2と3の売位は、そおれぞれのクエリの中で 最後のところ、 2では ORDER BY 日付 DESC, id DESC 3では、 ORDER BY 日付 DESC, id ASC のようにDECとASCの違いにより取り出すレコードを 変えています。このDESCとASCはクエリの並び替えの ところでの操作にかかわるキーワードです。それぞれ については、WEBで   ms access クエリ 並び替え DESC などで検索するか、参考書で確認してください。 なお、複数のグループで同じ日付のレコードが存在しても 同様に抽出されます。 以上です。わからないところがあれば補足してください。

mihimarumaru
質問者

お礼

同じグループで日付が最大でかつ同じ日付のレコードが複数ある場合にも対応できるサブクエリを教えて頂きありがとうございます。 今後の学習にも役立たせて頂きます。

関連するQ&A

  • Accessの選択クエリから最終日付のデータのみ抽出したい

    Access2002を使用しています。 初心者ですのでよろしくお願いします。 アクセスで選択クエリを作成しました。 このクエリのフィールドは「日付」と「金額」です。 この選択クエリから最終日付のレコードのみを抽出する選択クエリを作製したいのですが、何か方法はありませんでしょうか? 最終日付に対応する金額を抽出したいイメージです。 なお、レコードの作製順番は、必ずしも日付順とはなっていません。(例えば、7/2付でレコードを作成後、7/1付で次のレコードを作製している場合もあります。) 一つの方法として、選択クエリのデザインフォームで集計ボタンを押して日付フィールドの集計項目(グループ化)で「最後」を選択しているのですが、「金額」が全レコード表示されてしまいます。 また、同様にして、金額フィールドの集計項目で「最後」を選択すると、最後に作成したレコードが表示されてしまいます。(上記の例では、7/2ではなく7/1のレコードが表示されます。7/2に対応する金額を抽出したいのですが…) アドバイスよろしくお願いします。

  • ACCESS2000 パラメータークエリー

     ウィンドウズ98、ACCESS2000です。  パラメータークエリーの作り方で、とあるテキストを入力すると それに対応するレコード抽出というのありますか?    とある日付を入力すると、それに対応するレコードを持ってくる パラメータークエリーは作れます。

  • Accessでの抽出について

    Accessでのクエリーでの抽出の方法を教えてください。 たとえば「12345678」といったIDをもたせた人のデータが日付ごとにいくつかレコードがある場合に、クエリーのID欄の抽出条件欄には、「12345678」と入力すれば、その人のデータのみが表示されると思います。 そこで、 (1)その中の日付から、最新のものから3つを抽出したい場合。 (2)その中の日付から、2番目に新しいものを抽出したい場合。 において、クエリーの抽出条件になんて書いたらよいのでしょうか? できましたら、(1)(2)それぞれお答えいただければ幸いです。 どうぞよろしくお願いいたします。

  • Access2013で翌日のデータのみのクエリ

    お世話になります。 Access2013を使用しており、2つの日付フィールドを比較して 翌日のレコードのみ抜き出したい場合のクエリについて質問で ございます。 日付Aフィールド と 日付Bフィールドが あり、それぞれ日付と時刻が書式yyyy/mm/dd hhmmss で格納されております。 このうち、クエリで抽出したいのは、 日付Bフィールドに格納されている、 日付Aフィールドの翌日のレコードのみを 抽出したいです。 その際、時刻(hhmmss)は無視して翌日のレコードを 抽出したいです。 例えば、 日付Aフィールドに 2016/08/24 15:00:00 2016/08/24 16:00:00 2016/08/24 17:00:00 というデータが格納されていて、 日付Bフィールドに 2016/08/25 00:00:00 2016/08/25 17:00:00 2016/08/26 00:00:00 というデータが格納されていた場合、 日付Bフィールドの 2016/08/25 00:00:00 2016/08/25 17:00:00 のみ抽出したいです。 この場合のクエリの設定方法を教えてください。 どうぞ宜しくお願いいたします。

  • アクセスについて

    アクセスのレコード数483件のテーブルをクエリーで抽出しフォームで表示しているのですが、480件しか表示出来ません、どこか作成、設定で間違えがあるのか教えてください。

  • ACCESS クエリで”1”でないものを選択するには?

    ACCESS2003で排他選択("1"でないものを選択) をしたいのですが あるフィールドに”1”かブランクが入っていて ”1”以外のものを選択したいのですが クエリのデザイン画面で ------------------------- フィールド テーブル 並べ替え 表示 抽出条件  <> "1" ------------------------- 抽出条件に = "1" を入れると、"1"のレコードのみ 選択できます やりたいのは "1"以外のものを選択したいのです そこで 抽出条件に<> "1"といれると レコードがゼロ件になります また、Not "1"とか <> "1"、とか、Not = "1" と入れてみても、抽出結果はゼロ件になります 原因を教えてください

  • アクセスのテキスト型フィールドの初期値

    アクセスのテーブルにテキスト型フィールド「●●日付」を作成しました。さらに、定型入力の方法として、日付(____/__/__)を指定しています。 このテーブルから、クエリでデータを取得する際、●●日付にデータを入力していないレコードのみを取得したいと思い、クエリの抽出条件として=""(ダブルクォーテーション)や=''(シングルクォーテーション)と記載したのですが、レコードが1件も抽出されません(もちろん●●日付にデータを入れていないレコードは複数あります)。一方で、<>""や<>''で、●●日付にデータが入力されているレコードを抽出しようとした場合は、●●日付にデータが入力されているレコードが抽出されます。 テキスト型フィールドにデータが入力されていないレコードを抽出するクエリはどのようにしたら作成できるのでしょうか?

  • Access2003一つのクエリで結果を出したい2

    お世話になります。 Access2003を利用しておりますが、一つのクエリで以下の算出(抽出?)は可能でしょうか。 検品テーブル  ・ID  ・ライン  ・グループ  ID ライン グループ  1  L1    G1  2  L1    G1  3  L1    G2  4  L1    G2  5  L1    G2  6  L2    G3  7  L2    G3  8  L3    G4  9  L3    G4  10  L3    G4  11  L3    G4  12  L3    G5  13  L3    G5  14  L3    G6  15  L4    G7 結果として、一つのラインでのグループ数の最大値(上記の例だとL3はグループが3つあるので3)を一つのクエリで算出したいと考えております。 以下のように3つのクエリを作成すれば結果は得られるのですが、できれば一つのクエリでやりたいところです。  (1)検品テーブルを、[ライン]と[グループ]でグループ化    L1 G1    L1 G2    L2 G3    L3 G4    L3 G5    L3 G6    L4 G7  (2)上記クエリをグループ化し[グループ]をカウント    L1 2    L2 1    L3 3    L4 1  (3)上記クエリでグループカウントの最大値      3 この最大値3を算出するのを一つのクエリで行いたいのですが、可能でしょうか。 ご教授お願い致します。

  • accessのクエリとフォームの関係についてお尋ねします。

    accessのクエリとフォームの関係についてお尋ねします。 IDを主キーとした同じような構造のテーブルを3つ繋いでクエリを作成し、更にそのクエリをレコードソースとしたフォームを作成しました。 ところがフォームが動かない。テキストボックスを3つ作っていますが、何も表示してないし、レコードも移動しません。 まいった。 accessは2003、vistaを使っております。 素人です。よろしくご教授くださいませ。

  • Access97のクエリーについて

    Access97のクエリーで次のようなデータ抽出をしたいのですが、設定方法が良く分かりません。 1.約20000レコードのCSVファイルを外部データ   のインポートでTDLを作成。 2.重複クエリーを走行すると、約10000レコードが   重複していた。 3.作成したTBLから重複者がいないデータを抽出した   い。 イメージ: 処理前  a,2222,111,1,1234567  a,1111,100,1,0001234  b,0001,234,1,5555511  c,0003,001,1,0005555  c,0005,201,1,3345678  ↓(クエリー) 処理後  a,1111,100,1,0001234  b,0001,234,1,5555511  c,0003,001,1,0005555 どのような、関数、クエリーを使えば実現できるのでしょ うか。ご教示の程よろしくお願いします。

専門家に質問してみよう