アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

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でもよいのでどなたかご教示お願い致します。

A 回答 (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購入日が同一で連番が大きいレコード
が存在しないものという条件で取得します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/02/02 18:06

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の何万倍もの処理時間がかかります。できても
却下です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/02/02 18:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!