Access SQLで月別の最新日付を取得する方法

このQ&Aのポイント
  • Accessで顧客管理をしている場合、月ごとの最新の日付を取得する方法について教えてください。
  • 例えば、顧客ごとに1月1レコードを取得し、同じ月内に顧客が複数のレコードを持っている場合は最新の日付を取得する方法を知りたいです。
  • もし、同じ月内で最新の日付が複数存在する場合は、連番が多い方の日付を取得する方法を教えてください。
回答を見る
  • ベストアンサー

Access [SQL]月別ので最新日付取得方法

お世話になります。 Accessで顧客管理をしています。 【出力条件】 (1) 顧客IDごとに1月1レコード (2) 同月内に顧客IDが2レコード以上ある場合は最新の購入日 (3) (2)が2レコード(同月内最新の購入日が2レコードある場合は、連番が多い方) 言葉でうまく説明できないのですが・・・ 月 購入日 顧客ID  連番 -------------------------- 04 2010/04/01 a-136 001 04 2010/04/09 a-136 001 04 2010/04/09 a-136 002 04 2010/04/10 b-991 001 04 2010/04/11 b-991 001 04 2010/04/11 b-991 002 04 2010/04/12 b-991 001 04 2010/04/13 b-991 001 05 2010/05/05 a-136 001 05 2010/05/13 e-991 001 05 2010/05/13 e-991 002 05 2010/05/30 s-333 001 このような表の場合、出力結果を 月 購入日 顧客ID ----------------------- 04 2010/04/09 a-136 002 04 2010/04/13 b-991 001 05 2010/05/05 a-136 001 05 2010/05/13 e-991 002 05 2010/05/30 s-333 001 のように出すクエリー(SQL文)を教えて頂けますでしょうか? もし、クエリーが無理ならVBAでもよいのでどなたかご教示お願い致します。

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

NOT EXISTSを使ってもよさそうです。 --全角でインデントしています select * from 表 a where not exists (  select * from 表 b  where a.顧客ID = b.顧客ID  and a.月 = b.月  and (a.購入日 < b.購入日 or (a.購入日 = b.購入日 and a.連番 < b.連番)) ); 自レコードと顧客ID・月が同一で、購入日が後のデータor購入日が同一で連番が大きいレコード が存在しないものという条件で取得します。

kazuya_rx93
質問者

お礼

できました!! 助かりました、本当にありがとうございます。

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

SQLを考える時は論理の組み立てが大事で、 それをしないで「どうしましょう?」では先に 進みません。以下は理論です。 (1)月、顧客ID毎に集計し、購入日は最大値を取る。 (2)上記クエリと元のデータを結合して、月、顧客ID、  購入日は最大値毎に集計し、連番は最大値を取る。 これを具体化すると以下のようになります。 SELECT A.月,A.顧客ID,B.最大購入日 AS 購入日, MAX(A.連番) AS 連番 FROM 表 AS A INNER JOIN (SELECT 月,顧客ID,MAX(購入日) AS 最大購入日 FROM 表 GROUP BY 月,顧客ID) AS B ON A.月=B.月 AND A.顧客ID=B.顧客ID AND A.購入日=B.最大購入日 GROUP BY A.月,A.顧客ID,B.最大購入日 解説しますと、(SEELCT~)の部分が(1)にあたります。 これをサブクエリと言います。これと元のデータを結合 して、目的のデータを抽出します。英語なので、記述は 理論の組み立てとは反対に構築されます。 尚、こういう処理をVBAでやろうと考えてはいけません。 SQLの何万倍もの処理時間がかかります。できても 却下です。

kazuya_rx93
質問者

お礼

大変参考になりました。 勉強不足でした。

関連するQ&A

  • Accessの連番(文字+日付+文字)

    フォームで新規入力をする際に自動で連番を振りたいです 初心者でいろいろと調べているのですがうまくいきません 下記のような連番を振る方法を教えてください "Eyymmdd A "E"は固定で yy(西暦2ケタ)mm(月)dd(日)A(Aから始め、同じ日だとB,C,…と最大26(Z)まで)振っていく。日が変わるとまたAから始まる 「テーブル名」連絡文書E 「クエリ名」連絡文書Eクエリ 「フォーム名」連絡文書E 「フィールド名」管理番号(テキスト型) E110105 A E110130 A E110130 B E110130 C E110202 A… と"E"を固定 yy(西暦2ケタ)mm(月)dd(日)Aから始まり、同日であればB,C~と 日が変わるとAからまた始まるという連番をふりたいです 煮詰まってしまい、どうしてよいかわからない次第です 初心者にとても難しい事は承知しておりますが、何卒よろしくお願い致します

  • アクセス2010 最新データを抽出する方法

    はじめまして。 アクセスを猛勉強中の初心者です。 過去記事を探しましたが、解決できませんでしたのでご教示お願いします。 やりたいことは、2つのテーブルからクエリを使って、最新のデータを抽出したいです。 ですが、その中に抽出したくないワードが存在します。 それ以外のワードで最新のデータを抽出したいです。 まず、下記のような2つのテーブルがあります。 ●テーブル1        ・ID(主キー)       ・日付 ・コメント ・顧客ID ●テーブル2 ・顧客ID(主キー) ・顧客名 ・住所 次にこのテーブルをクエリにしてデータを返すと、下記のようになります。 日付    コメント      顧客名    ・2/1     保留       Aさん ・2/1     発送       Bさん       ・2/1     相談       Cさん ・2/2    次回未定     Bさん ・2/3     発送       Aさん  ・2/4    次回未定     Dさん        今回抽出したいデータは、「発送」というワードをはぶいた最新のデータをとりたいということです。 なので、データとしては、 日付    コメント      顧客名    ・2/1     保留       Aさん ・2/1     相談       Cさん ・2/2    次回未定     Bさん ・2/4    次回未定     Dさん と、このように抽出したいのです。 最新データの抽出にはMax関数を使ってでき、いらないワードである「発送」はクエリのフィールドの抽出条件に『<>”発送”』と入力することで抽出を防ぐことができたのですが、これらの方法でMax関数を入れて最新データの抽出をしようとすると、全ての「発送」を除いたデータが抽出されるので、最新データに該当する顧客のデータが消えてしまいます。 なので、本来のコメントデータが分からない状態になります。 また、エクセル側でパラメータクエリを使って資料を作成し、アクセスに触ったことがない人たちが使用するので、アクセスを更新してといったことができません。 なので、更新クエリなどを使ってのやり方以外の方法はないでしょうか? 全くの初心者ですので、言葉足らずで説明が分かり辛くて申し訳ありません。 ご教示をお願いいたします。

  • 副問合せを使わないでグループごとの最新日付を取得

    MySQL4.0.2x を使用して、検索プログラムを実装させようとしていますが、 副問合せに慣れてしまってどうSQL文を書いてよいか考えあぐねています。 何かよいやり方がありましたらご教授ください。 やろうとしていることは、以下の発行履歴テーブルを購入IDでグループ化し、そのグループ内で発行日が最新のレコードを、全カラム分引っ張ってくる。 (結果は購入IDが一意になっている) そしてそのテンポラリーテーブルを作成することです。(後で別テーブル群と購入IDでJOINさせるため) どうもサンプルテーブルの空白が崩れてしまって見づらくて申し訳ないですが、宜しくお願いします。 ■ユニーク:参照番号 +----------+--------+------------+---------------+---------------------+---------------+-------- | 購入ID | 連番 | 商品コード | 参照番号 | 発行日 | IP   | ・・・ (以降略) +----------+--------+------------+---------------+---------------------+---------------+-------- | 0001 | 1 | pen_00580 | 000000001_001 | 2008-01-01 00:11:01 | 123.45.678.90 | ・・・ | 0002 | 1 | rot_00187 | 000000002_001 | 2008-01-03 00:13:49 | 111.22.333.44 | ・・・ | 0002 | 2 | rot_00187 | 000000002_002 | 2008-01-03 00:14:25 | 111.22.333.44 | ・・・ | 0003 | 1 | ter_09523 | 000000003_001 | 2007-12-25 00:19:40 | 555.66.777.88 | ・・・ | 0004 | 1 | rot_00187 | 000000004_001 | 2007-12-28 00:20:02 | 999.88.777.66 | ・・・ | 0005 | 1 | min_00210 | 000000005_001 | 2007-12-26 00:20:10 | 543.21.098.76 | ・・・ | 0005 | 2 | min_00210 | 000000005_002 | 2007-12-30 00:30:55 | 543.21.098.76 | ・・・ | 0005 | 3 | min_00210 | 000000005_003 | 2008-01-03 00:36:30 | 543.21.098.76 | ・・・ | 0006 | 1 | rot_00187 | 000000006_001 | 2008-01-10 00:45:24 | 123.45.678.90 | ・・・ +----------+--------+------------+---------------+---------------------+---------------+-------- ちなみに自分が作成したもの (1)第1回一時テーブル CREATE TEMPORARY TABLE 一時テーブル1 SELECT 購入ID, max(参照番号) 参照番号, max(発行日) 発行日 FROM 発行履歴 GROUP BY 購入ID (2)第二回一時テーブル CREATE TEMPORARY TABLE 一時テーブル2 SELECT A.* FROM 発行履歴 A RIGHT JOIN (一時テーブル1) B ON A.参照番号=B.参照番号

    • ベストアンサー
    • MySQL
  • Accessで最新データを取得する方法

    Accessで最新日時のデータを取得できるクエリを作りたいです。 例えば以下のようなデータを、、、 ------------------------------------------ 社員  売上日時  売上金額 Aさん  2015/12/10 50,000 Aさん  2015/12/25 35,000 Bさん  2015/12/15 40,000 Bさん  2015/12/28 60,000 Cさん  2015/12/13 90,000 Cさん  2015/12/28 50,000 ------------------------------------------ 以下のようにして取得したいです。 ------------------------------------------ 社員  売上日時  売上金額 Aさん  2015/12/25 35,000 Bさん  2015/12/28 60,000 Cさん  2015/12/28 50,000 ------------------------------------------ 現状のクエリですと古い日時のデータを引っ張り出してきてしまい、 困っています。。。 どのようなクエリを組めば最新日時のデータを取得できるように なりますでしょうか。 ご教示いただけますと幸いです。

  • ある条件でのSQLの取得方法について

    以下の条件でのSQLのデータの取得方法が分かりません。 2つのテーブルがあるとします。 ・テーブルA キー   項目1 10     X 20     Y ・テーブルB キー  項目2  項目3 10     5    C 10     6    D 12     6    E ここで取得する条件として ■テーブルAにあるのは、必ず取得します。 ■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は  別レコードとして取得します。 ■テーブルAのキー1つに対して、テーブルBのキーは無いかも知れないし、  複数件あるかも知れません。  無い場合はテーブルAの情報のみを出力し、複数件ある場合はその全てを出力します。 ■テーブルBの項目2が同じ値のデータがある場合、テーブルBを出力したレコードと  同じレコードに、項目2が同じデータの情報を出力します。  項目2が同じデータが無い場合はこの情報は出力しません。  項目2が同じ値のデータは最大2件しかありません。 上記の例の場合に出力したい結果 ・出力テーブルC キー  フラグ   項目1  項目2  項目3   項目2が同じキー  項目2が同じ値 10  テーブルA   X 10  テーブルB         5    C 10  テーブルB         6    D        12            E 20  テーブルA   Y (テーブルC のフラグとは、テーブルAの情報かテーブルBの情報かを示します) これを出来ればSQL、出来なければPL/SQLで取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?

  • ACCESS 一番最新の日付の金額を出したいのですが・・

    社員ID/交通費/登録日 のフィールドがあるテーブルがあります。 社員ID/交通費/登録日 0001  800  2007/4/1 0002  400  2007/4/2 ・ ・ 0001 700  2007/5/2 となった場合、0001の人は700円と言う風に登録日が最新のものを抽出したいのですが クエリをつくり登録日の集計を「最大」にしてみたら、日付は5/2がちゃんと出ますが、金額がその登録日以外の金額になるのです。 どうすればよいでしょうか? 分かる方教えて下さい。宜しくお願いします。  

  • Accessの連番(文字+日付+文字)2 (泣)

    先だって下記の質問をさせていただいた際には回答いただいてありがとうございました ≪質問≫ 下記のような連番を振る方法を教えてください "Eyymmdd A "E"は固定で yy(西暦2ケタ)mm(月)dd(日)A(Aから始め、同じ日だとB,C,…と最大26(Z)まで)振っていく。日が変わるとまたAから始まる 「テーブル名」連絡文書E 「クエリ名」連絡文書Eクエリ 「フォーム名」連絡文書E 「フィールド名」管理番号(テキスト型) E110105 A E110130 A E110130 B E110130 C E110202 A… と"E"を固定 yy(西暦2ケタ)mm(月)dd(日)Aから始まり、同日であればB,C~と 日が変わるとAからまた始まるという連番をふりたいです ≪いただいた回答≫ Function getNewSeq()   If Format(Date, "yymmdd") = Mid(DMax("管理番号", "連絡文書E"), 2, 6) Then     If Right(DMax("管理番号", "連絡文書E"), 1) = "Z" Then       MsgBox "Zまで一杯です"       Exit Function     End If     getNewSeq = "E" & Format(Date, "yymmdd") & " " & _           Chr(Asc(Right(DMax("管理番号", "連絡文書E"), 1)) + 1)   Else     getNewSeq = "E" & Format(Date, "yymmdd") & " " & "A"   End If End Function さらに、フォームでも デザインビューでフォームのプロパティのイベントの、「レコード移動時」に Private Sub Form_Current() If Me.NewRecord Then Me!管理番号 = getNewSeq End If End Sub 補足をさせていただいたデバックも何度かテーブルからやり直し できるようになりました!! 本当に助かりました しかし、新たにわからない事態が起きてしまいました ご教示下さい フォームを単票形式で作成して、上記の連番が振れるようになりました しかし、データシート(形式)でフォームを作成したところ連番が振られなくなってしまいました 同じAccess内でではなく、新規作成したり、同じAccess内でのフォーム新規作成をしてみましたが、できません データシートでの連番は無理なのでしょうか? 「テーブル名」連絡文書E 「クエリ名」連絡文書Eクエリ 「フォーム名」連絡文書E2 「フィールド名」管理番号(テキスト型) テーブルとクエリは前回と同じものを使いました 何卒ご教示お願いいたします

  • access 2つのテーブルの最新日付の大小

    顧客はIDにて管理していて、請求日テーブルに顧客ID、請求日の2つのフィールド、入金日テーブルに顧客ID、入金日と作り、どんどん追加していく仕組みにしています。 ここで、未入金の顧客を探したいと思っています。 入金日>請求日であれば出るとは思うのですが、SQLにて select max(T入金日.入金日) as 入金日, T入金日.ID from T入金日 group by T入金日.ID と作り、同様に請求日の式も作りましたが、この式どうしを比べる方法がわかりません。 クエリのデザインビューでも同じようなところまでは作れるのですが… また、請求日を基準にして前後半年入金のない顧客を探せる方法もあれば合わせて教えていただきたいです。 ヒントや作り方でもいいので、何かご教授ください

  • 最新の日付を持つレコードと結合したい。

    SQLserver2005環境です。 AとB、2つのテーブルを結合しようと考えています。 Bはキーを持たないテーブルです。 仮にですが テーブルA ID --- 1 2 3 テーブルB ID    時間 --- 1    12:00 1    13:00 2    10:00 3    11:00 3    12:00 3    15:00 のようになっていた場合、Bテーブルの一番新しい日付のもののみと 結合したいと考えています。 なので、上の例だと、結合後 ID    時間 --- 1    13:00 2    10:00 3    15:00 となるようにしたいのです。 実際のテーブルにはIDや時間の他にも様々な値があり、ID以外の値が 違うレコードであっても、IDが同じであれば、最新のレコードのみ 結合対象にするような仕様です。 (なのでGroup Byを使うと実現できない?) イメージとしては、結合する際に、on句でより新しいほうを、という条件を 指定できたらなぁと思っているんですが、うまく作れず困っています。 ご教授いただけないでしょうか? よろしくお願いします。

  • 1:Nの結合結果として最新日付のもので1:1としたい。

    Oracle9i Enterprise Edition R2の環境下で 以下のような2つのテーブルをを結合し [Output]の内容を抽出したいと思っております。 A table (顧客) **************************************** ID name A001 Robart A002 Todd B table (履歴) **************************************** ID name Date B001 A001 08/04/01 B002 A001 09/04/30 B003 A001 09/04/10 B004 A002 09/02/13 B005 A002 09/03/02 [Output] **************************************** A.name B.ID B.Date A001 B002 09/04/30 A002 B005 09/03/02 Aテーブル単位にBテーブルの最新日付の レコードを結合して抽出したいのですが、 MAX関数を使い試行錯誤しているのですが、 うまく行きません。どうか結合方法をご教示ください。 宜しくお願い致します。