• ベストアンサー

Accessクエリ

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

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

  • ベストアンサー
  • m3_maki
  • ベストアンサー率64% (296/460)
回答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