顧客と商品ごとに購入日時が最新のデータを取得する方法

このQ&Aのポイント
  • MySQL5のデータベースで、テーブル1から顧客と商品ごとに購入日時が最新のデータを抽出する方法を説明します。
  • 購入日時が最新のデータを抽出するためには、左側の番号が同じ商品の中で購入日が最新のデータのみを抽出する必要があります。
  • サンプル1は、顧客と商品ごとに購入日時が最新のデータが抽出された結果です。
回答を見る
  • ベストアンサー

顧客と商品ごとに購入日時が最新のデータを取得したい

お世話になります。 以下のテーブル1からサンプル1のようなデータを抽出したいのですが、SQLはどのように書いたらよいでしょうか。 ・顧客と商品ごとに購入日時が最新のデータを取得 ・商品は左側の番号が同じ場合は購入日が最新のデータのみ抽出したい データベースは MySQL5 です。 よろしくお願いいたします。 ●テーブル1 顧客  商品  購入日時 ---------------------------------  A  2-2  2014-04-23 08-00-00  A  2-1  2014-04-21 08-00-00  B  2-3  2014-04-20 09-00-00  B  2-2  2014-04-18 06-00-00  B  2-1  2014-04-15 05-00-00  A  1-3  2014-04-12 08-00-00  A  1-2  2014-04-10 04-00-00  C  2-2  2014-04-09 05-00-00  C  2-1  2014-04-08 06-00-00  C  1-2  2014-04-07 08-00-00  C  1-1  2014-04-06 05-00-00  A  1-1  2014-04-05 02-00-00  B  1-2  2014-04-04 02-00-00  B  1-1  2014-04-03 01-00-00 ●サンプル1 顧客  商品  購入日時 ---------------------------------  A  2-2  2014-04-23 08-00-00  B  2-3  2014-04-20 09-00-00  A  1-3  2014-04-12 08-00-00  C  2-2  2014-04-09 05-00-00  C  1-2  2014-04-07 08-00-00  B  1-2  2014-04-04 02-00-00

  • MySQL
  • 回答数3
  • ありがとう数9

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

たぶんこういうことをしたいのだと思うけど・・・・ select 顧客,商品,max(購入日時) as 購入日時 from tbl group by 顧客,left(商品,1) order by 購入日時 desc; 商品をx-xのような形式でもつとデータの持ち方が冗長で効率的な集計ができない 素直に枝番で分けている分を別カラムに分けたほうがよいでしょう また、各レコードを認識するためのidを振ってprimary keyを設定するのがスマートです 日時が一緒だった場合どうするとか考えるべき問題はほかにもあります

sirowabi
質問者

お礼

本当に度々すみません、上に二度もおかしなデータを貼り付けてしまいました。 頭がまわっていないようです、書き込める欄がもうないので出直してまいります。 本当にありがとうございます。m(_ _)m

sirowabi
質問者

補足

回答ありがとうございます。 上記教えていただいたSQL文はサンプルに書いた質問のテーブルだとうまくいっているのですが、実際のテーブルで使うと、なぜか商品だけデータが古いものを取得しています。 >素直に枝番で分けている分を別カラムに分けたほうがよいでしょう やはりそうですよね。 わかってはいてもなんとか出来たらなぁと思うとつい。 >また、各レコードを認識するためのidを振ってprimary keyを設定するのがスマートです すみません、素人眼鏡で質問に使ったテーブルにid欄を書き忘れました。実際のテーブルには存在します。 また、日時が一緒のものは基本的に存在しないものと思っていただいて大丈夫です。 いろいろとありがとうございます、もう少し悩んでみます。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

枝番管理も難点は桁がふえたときの問題です 仮に11-30とか出てきたときに文字列でのみ判断すると 11-30には1-3が含まれていますので1-3を抽出しようとして11-30まで ヒットしてしまうことになりかねません ざっと、枝番を別カラムに分けた例をあげておきます。 //テーブル作成 create table tbl (id int not null primary key,顧客 varchar(10),商品a int,商品b int,購入日時 datetime); insert into tbl values (1,'A','2','2','2014-04-23 08:00:00') ,(2,'A','2','1','2014-04-21 08:00:00') ,(3,'B','2','3','2014-04-20 09:00:00') ,(4,'B','2','2','2014-04-18 06:00:00') ,(5,'B','2','1','2014-04-15 05:00:00') ,(6,'A','1','3','2014-04-12 08:00:00') ,(7,'A','1','2','2014-04-10 04:00:00') ,(8,'C','2','2','2014-04-09 05:00:00') ,(9,'C','2','1','2014-04-08 06:00:00') ,(10,'C','1','2','2014-04-07 08:00:00') ,(11,'C','1','1','2014-04-06 05:00:00') ,(12,'A','1','1','2014-04-05 02:00:00') ,(13,'B','1','2','2014-04-04 02:00:00') ,(14,'B','1','1','2014-04-03 01:00:00'); ※実際の運用時にはインデックスなど適宜設定する //集計 select id,顧客,商品a,商品b,購入日時 from tbl where (顧客,商品a,購入日時) in (select 顧客,商品a,max(購入日時) from tblgroup by 顧客,商品a) order by 購入日時 desc; >商品に"3"という文字を含むもののみ取得 select id,顧客,商品a,商品b,購入日時 from tbl where (顧客,商品a,購入日時) in (select 顧客,商品a,max(購入日時) from tbl group by 顧客,商品a) and (商品a=3 or 商品b=3) order by 購入日時 desc ※3を含むというのが「13」や「30」まで含むかどうかで いろいろやりかたに工夫が必要になります

sirowabi
質問者

お礼

度々すみません! カンマがおかしな位置に! 修正版です。 CREATE TABLE IF NOT EXISTS `TABLE1` ( `SEQ_ID` mediumint(8) NOT NULL AUTO_INCREMENT COMMENT 'シーケンスID', `TO_USER_NM` varchar(128) DEFAULT NULL COMMENT '顧客', `MAIL_TITLE` varchar(256) DEFAULT NULL COMMENT '商品', `SEND_TIME` datetime NOT NULL COMMENT '購入日時', PRIMARY KEY (`SEQ_ID`) ); INSERT INTO `TABLE1` (`SEQ_ID`, `TO_USER_NM`, `MAIL_TITLE`, `SEND_TIME`) VALUES (1 , '顧客A', '『商品1』仮申込', '2014-03-01 13:07:43'), (2 , '顧客C', '『商品1』仮申込 / 変更1', '2014-03-02 10:06:54'), (3 , '顧客E', '『商品1』本申込', '2014-03-03 10:06:54'), (4 , '顧客E', '『商品1』仮申込', '2014-03-04 13:33:51'), (5 , '顧客B', '『商品1』本申込', '2014-03-05 14:58:41'), (6 , '顧客A', '『商品1』本申込 / 変更1', '2014-03-06 16:42:56'), (7 , '顧客D', '『商品1』本申込 / 変更2', '2014-03-07 17:27:33'), (8 , '顧客C', '『商品1』本申込 / 変更1', '2014-03-08 13:56:29'), (9 , '顧客A', '『商品2』仮申込', '2014-03-09 18:44:05'), (10, '顧客A', '『商品2』仮申込 / 変更1', '2014-03-10 10:43:14'), (11, '顧客C', '『商品1』本申込 / 変更2', '2014-03-11 08:51:02'), (12, '顧客C', '『商品1』本申込 / 変更3', '2014-03-12 20:33:39'), (13, '顧客A', '『商品2』本申込', '2014-03-14 18:52:44'), (14, '顧客B', '『商品1』仮申込', '2014-03-15 16:13:47'), (15, '顧客B', '『商品1』本申込 / 変更3', '2014-03-16 21:07:35'), (16, '顧客B', '『商品1』本申込 / 変更4', '2014-03-18 21:07:34'), (17, '顧客B', '『商品3』仮申込', '2014-03-19 21:42:46'), (18, '顧客B', '『商品3』本申込', '2014-03-20 22:14:10'), (19, '顧客A', '『商品2』本申込 / 変更1', '2014-03-21 23:44:06'), (20, '顧客A', '『商品1』本申込 / 変更5', '2014-03-22 08:22:59'), (21, '顧客A', '『商品2』仮申込', '2014-04-01 13:07:43'), (22, '顧客A', '『商品2』本申込 / 変更2', '2014-04-02 10:06:54'), (23, '顧客B', '『商品2』仮申込', '2014-04-03 10:06:54'), (24, '顧客B', '『商品2』仮申込 / 変更1', '2014-04-04 13:33:51'), (25, '顧客B', '『商品2』本申込', '2014-04-05 14:58:41'), (26, '顧客F', '『商品1』仮申込', '2014-04-06 16:42:56'), (27, '顧客F', '『商品1』本申込', '2014-04-07 17:27:33'), (28, '顧客G', '『商品3』仮申込', '2014-04-08 13:56:29'), (29, '顧客F', '『商品1』本申込 / 変更1', '2014-04-09 18:44:05'), (30, '顧客G', '『商品3』本申込', '2014-04-10 10:43:14'), (31, '顧客A', '『商品1』本申込 / 変更6', '2014-04-11 08:51:02'), (32, '顧客A', '『商品2』本申込 / 変更3', '2014-04-12 20:33:39'), (33, '顧客F', '『商品1』本申込 / 変更2', '2014-04-14 18:52:44'), (34, '顧客C', '『商品3』仮申込', '2014-04-15 16:13:47'), (35, '顧客C', '『商品3』本申込', '2014-04-16 21:07:35'), (36, '顧客H', '『商品1』仮申込', '2014-04-18 21:07:34'), (37, '顧客H', '『商品1』本申込', '2014-04-19 21:42:46'), (38, '顧客H', '『商品1』本申込 / 変更1', '2014-04-20 22:14:10'), (39, '顧客E', '『商品2』仮申込', '2014-04-21 23:44:06'), (40, '顧客E', '『商品2』本申込', '2014-04-22 08:22:59');

sirowabi
質問者

補足

大変親切にありがとうございます。 いろいろとご指摘恐れ入ります。 カラム分けについても今後の参考にさせていただきます。 ある程度ヒントだけでもいただけたら自分で出来るだろうと思っていたので、最初の質問に書いたデータはかなりおおまかになっていたため、回答者様への情報提供が後出し状態で本当に申し訳ありません。 以下、実際のデータに近いサンプルを用意させていただきました。 ■テーブルデータ CREATE TABLE IF NOT EXISTS `TABLE1` ( `SEQ_ID` mediumint(8) NOT NULL AUTO_INCREMENT COMMENT 'シーケンスID', `TO_USER_NM` varchar(128) DEFAULT NULL COMMENT '顧客', `MAIL_TITLE` varchar(256) DEFAULT NULL COMMENT '商品', `SEND_TIME` datetime NOT NULL COMMENT '購入日時', PRIMARY KEY (`SEQ_ID`) ); INSERT INTO `TABLE1` (`SEQ_ID`, `TO_USER_NM`, `MAIL_TITLE`, `SEND_TIME`) VALUES (1 , '顧客A', '『商品1』仮申込', , '2014-03-01 13:07:43'), (2 , '顧客C', '『商品1』仮申込 / 変更1', '2014-03-02 10:06:54'), (3 , '顧客E', '『商品1』仮申込', '2014-03-03 10:06:54'), (4 , '顧客E', '『商品1』本申込', '2014-03-04 13:33:51'), (5 , '顧客B', '『商品1』本申込', , '2014-03-05 14:58:41'), (6 , '顧客A', '『商品1』本申込 / 変更1', '2014-03-06 16:42:56'), (7 , '顧客D', '『商品1』本申込 / 変更2' '2014-03-07 17:27:33'), (8 , '顧客C', '『商品1』本申込 / 変更1' '2014-03-08 13:56:29'), (9 , '顧客A', '『商品2』仮申込', , '2014-03-09 18:44:05'), (10, '顧客A', '『商品2』仮申込 / 変更1', '2014-03-10 10:43:14'), (11, '顧客C', '『商品1』本申込 / 変更2', '2014-03-11 08:51:02'), (12, '顧客C', '『商品1』本申込 / 変更3' '2014-03-12 20:33:39'), (13, '顧客A', '『商品2』本申込', , '2014-03-14 18:52:44'), (14, '顧客B', '『商品1』仮申込', , '2014-03-15 16:13:47'), (15, '顧客B', '『商品1』本申込 / 変更3', '2014-03-16 21:07:35'), (16, '顧客B', '『商品1』本申込 / 変更4' '2014-03-18 21:07:34'), (17, '顧客B', '『商品3』仮申込', '2014-03-19 21:42:46'), (18, '顧客B', '『商品3』本申込', '2014-03-20 22:14:10'), (19, '顧客A', '『商品2』本申込 / 変更1', '2014-03-21 23:44:06'), (20, '顧客A', '『商品1』本申込 / 変更5' '2014-03-22 08:22:59'), (21, '顧客A', '『商品2』仮申込', '2014-04-01 13:07:43'), (22, '顧客A', '『商品2』本申込 / 変更2', '2014-04-02 10:06:54'), (23, '顧客B', '『商品2』仮申込', '2014-04-03 10:06:54'), (24, '顧客B', '『商品2』仮申込 / 変更1', '2014-04-04 13:33:51'), (25, '顧客B', '『商品2』本申込', '2014-04-05 14:58:41'), (26, '顧客F', '『商品1』仮申込', '2014-04-06 16:42:56'), (27, '顧客F', '『商品1』本申込', '2014-04-07 17:27:33'), (28, '顧客G', '『商品3』仮申込', '2014-04-08 13:56:29'), (29, '顧客F', '『商品1』本申込 / 変更1', '2014-04-09 18:44:05'), (30, '顧客G', '『商品3』本申込', '2014-04-10 10:43:14'), (31, '顧客A', '『商品1』本申込 / 変更6', '2014-04-11 08:51:02'), (32, '顧客A', '『商品2』本申込 / 変更3', '2014-04-12 20:33:39'), (33, '顧客F', '『商品1』本申込 / 変更2', '2014-04-14 18:52:44'), (34, '顧客C', '『商品3』仮申込', '2014-04-15 16:13:47'), (35, '顧客C', '『商品3』本申込', '2014-04-16 21:07:35'), (36, '顧客H', '『商品1』仮申込', '2014-04-18 21:07:34'), (37, '顧客H', '『商品1』本申込', '2014-04-19 21:42:46'), (38, '顧客H', '『商品1』本申込 / 変更1', '2014-04-20 22:14:10'), (39, '顧客E', '『商品2』仮申込', '2014-04-21 23:44:06'), (40, '顧客E', '『商品2』仮申込 / 変更1', '2014-04-22 08:22:59'); ■取得したいデータ ※顧客&商品ごとの本申込という文字列が含まれる最新データを取得したい ※商品名の長さは変動します(商品名には実際は番号はありません) 38, '顧客H', '『商品1』本申込 / 変更1', '2014-04-20 22:14:10' 35, '顧客C', '『商品3』本申込', '2014-04-16 21:07:35' 33, '顧客F', '『商品1』本申込 / 変更2', '2014-04-14 18:52:44' 32, '顧客A', '『商品2』本申込 / 変更3', '2014-04-12 20:33:39' 31, '顧客A', '『商品1』本申込 / 変更6', '2014-04-11 08:51:02' 30, '顧客G', '『商品3』本申込', '2014-04-10 10:43:14' 25, '顧客B', '『商品2』本申込', '2014-04-05 14:58:41' 18, '顧客B', '『商品3』本申込', '2014-03-20 22:14:10' 16, '顧客B', '『商品1』本申込 / 変更4' '2014-03-18 21:07:34' 12, '顧客C', '『商品1』本申込 / 変更3' '2014-03-12 20:33:39' 7 , '顧客D', '『商品1』本申込 / 変更2' '2014-03-07 17:27:33' 4 , '顧客E', '『商品1』本申込', '2014-03-04 13:33:51' ■現状 商品名(長さは変動)が同一のものを指定する必要があったため、前回教えていただいたSQLは一部(substr~のあたり)改変して使ってみました。 購入日時は最新のものを取得するのですが、他のデータは古いもの(IDの若いもの)を取得してしまいます。 最初に質問で書いたサンプルデータの書き方がそもそも時系列とは逆順になっていなかったため、教えていただいたSQLでは使えなかったようです。こちらの不手際で申し訳ありません。 SELECT SEQ_ID, TO_USER_NM, MAIL_TITLE, max( SEND_TIME ) AS SEND_TIME FROM TABLE1 GROUP BY TO_USER_NM, substr( MAIL_TITLE, 1, instr( MAIL_TITLE, '』' ) -1 ) ORDER BY SEND_TIME DESC まだまだ悩んでみます。。。

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

No.1様の回答で期待の結果が取れるのではないかと思いますが、select句にない項目をgroup by句に含めるのはMySQLでの拡張仕様ですので、集計以外の1案を。 select 顧客,商品, 購入日時 from テーブル1 T1 where not exists ( select * from テーブル1 T2 where T1.顧客 = T2.顧客 and left(T1.商品, 1) = left(T2.商品, 1) and T1.購入日時 < T2.購入日時 ) order by 購入日時 desc; not existsを使って、顧客・商品の1文字目が一致する、購入日時がより新しいレコードが存在しないレコードを取得します。

sirowabi
質問者

お礼

すみません、出来るだけ本番に近いサンプルデータで取得漏れの原因究明をしたかったのですが、完全に目的のデータが取得できてしまい、さらに困惑中です。 本番データベースでは取れたり取れなかったりという状態のため、なんともかんとも。。。 説明すら出来ず申しわけありません。 とりあえずこちらの質問は、補足欄も使い切ってしまったので出直して立て直そうと思います。 ありがとうございました。m(_ _)m SELECT SEQ_ID, TO_USER_NM, MAIL_TITLE, SEND_TIME FROM TABLE1 T1 WHERE NOT EXISTS ( SELECT * FROM TABLE1 T2 WHERE T1.TO_USER_NM = T2.TO_USER_NM AND substr( T1.MAIL_TITLE, 1, instr( T1.MAIL_TITLE, '』' ) -1 ) = substr( T2.MAIL_TITLE, 1, instr( T2.MAIL_TITLE, '』' ) -1 ) AND T1.SEND_TIME < T2.SEND_TIME) AND MAIL_TITLE like '%本申込%' ORDER BY SEND_TIME DESC

sirowabi
質問者

補足

回答ありがとうございます。 教えていただいたSQL文はこちらの質問に使ったテーブルではうまくいくのですが、実際のテーブルでは取得漏れが発生している??ようでうまくいきませんでした。 こちらの情報提示不足かもしれません。申し訳ありません。 ちなみにですが、この文に、さらに ・商品に"3"という文字を含むもののみ取得 という条件を追加するとしたら、order by の前あたりへ AND 商品 like '%3%' の追記でいいのでしょうか。

関連するQ&A

  • 顧客&商品+指定文字列を含む、最新のデータ取得

    お世話になります。 前回立てたトピック(http://okwave.jp/qa/q8565634.html)でサンプルデータにミスがあったため、立て直しです。 ※顧客&商品ごとの本申込という文字列が含まれる最新データを取得したい ※商品名の長さは変動します(商品名には実際は番号はありません) ※MySQL5です。 どうぞお知恵をお貸しください。 ■テーブルデータ CREATE TABLE IF NOT EXISTS `TABLE1` ( `SEQ_ID` mediumint(8) NOT NULL AUTO_INCREMENT COMMENT 'シーケンスID', `TO_USER_NM` varchar(128) DEFAULT NULL COMMENT '顧客', `MAIL_TITLE` varchar(256) DEFAULT NULL COMMENT '商品', `SEND_TIME` datetime NOT NULL COMMENT '購入日時', PRIMARY KEY (`SEQ_ID`) ); INSERT INTO `TABLE1` (`SEQ_ID`, `TO_USER_NM`, `MAIL_TITLE`, `SEND_TIME`) VALUES (1 , '顧客A', '『商品1』仮申込', '2014-03-01 13:07:43'), (2 , '顧客C', '『商品1』仮申込 / 変更1', '2014-03-02 10:06:54'), (3 , '顧客E', '『商品1』仮申込', '2014-03-03 10:06:54'), (4 , '顧客E', '『商品1』本申込', '2014-03-04 13:33:51'), (5 , '顧客B', '『商品1』本申込', '2014-03-05 14:58:41'), (6 , '顧客A', '『商品1』本申込 / 変更1', '2014-03-06 16:42:56'), (7 , '顧客D', '『商品1』本申込 / 変更2', '2014-03-07 17:27:33'), (8 , '顧客C', '『商品1』本申込 / 変更1', '2014-03-08 13:56:29'), (9 , '顧客A', '『商品2』仮申込', '2014-03-09 18:44:05'), (10, '顧客A', '『商品2』仮申込 / 変更1', '2014-03-10 10:43:14'), (11, '顧客C', '『商品1』本申込 / 変更2', '2014-03-11 08:51:02'), (12, '顧客C', '『商品1』本申込 / 変更3', '2014-03-12 20:33:39'), (13, '顧客A', '『商品2』本申込', '2014-03-14 18:52:44'), (14, '顧客B', '『商品1』仮申込', '2014-03-15 16:13:47'), (15, '顧客B', '『商品1』本申込 / 変更3', '2014-03-16 21:07:35'), (16, '顧客B', '『商品1』本申込 / 変更4', '2014-03-18 21:07:34'), (17, '顧客B', '『商品3』仮申込', '2014-03-19 21:42:46'), (18, '顧客B', '『商品3』本申込', '2014-03-20 22:14:10'), (19, '顧客A', '『商品2』本申込 / 変更1', '2014-03-21 23:44:06'), (20, '顧客A', '『商品1』本申込 / 変更5', '2014-03-22 08:22:59'), (21, '顧客A', '『商品2』仮申込', '2014-04-01 13:07:43'), (22, '顧客A', '『商品2』本申込 / 変更2', '2014-04-02 10:06:54'), (23, '顧客B', '『商品2』仮申込', '2014-04-03 10:06:54'), (24, '顧客B', '『商品2』仮申込 / 変更1', '2014-04-04 13:33:51'), (25, '顧客B', '『商品2』本申込', '2014-04-05 14:58:41'), (26, '顧客F', '『商品1』仮申込', '2014-04-06 16:42:56'), (27, '顧客F', '『商品1』本申込', '2014-04-07 17:27:33'), (28, '顧客G', '『商品3』仮申込', '2014-04-08 13:56:29'), (29, '顧客F', '『商品1』本申込 / 変更1', '2014-04-09 18:44:05'), (30, '顧客G', '『商品3』本申込', '2014-04-10 10:43:14'), (31, '顧客A', '『商品1』本申込 / 変更6', '2014-04-11 08:51:02'), (32, '顧客A', '『商品2』本申込 / 変更3', '2014-04-12 20:33:39'), (33, '顧客F', '『商品1』本申込 / 変更2', '2014-04-14 18:52:44'), (34, '顧客C', '『商品3』仮申込', '2014-04-15 16:13:47'), (35, '顧客C', '『商品3』本申込', '2014-04-16 21:07:35'), (36, '顧客H', '『商品1』仮申込', '2014-04-18 21:07:34'), (37, '顧客H', '『商品1』本申込', '2014-04-19 21:42:46'), (38, '顧客H', '『商品1』本申込 / 変更1', '2014-04-20 22:14:10'), (39, '顧客E', '『商品2』仮申込', '2014-04-21 23:44:06'), (40, '顧客E', '『商品2』仮申込 / 変更1', '2014-04-22 08:22:59'); ■取得したいデータ 38, '顧客H', '『商品1』本申込 / 変更1', '2014-04-20 22:14:10' 35, '顧客C', '『商品3』本申込', '2014-04-16 21:07:35' 33, '顧客F', '『商品1』本申込 / 変更2', '2014-04-14 18:52:44' 32, '顧客A', '『商品2』本申込 / 変更3', '2014-04-12 20:33:39' 31, '顧客A', '『商品1』本申込 / 変更6', '2014-04-11 08:51:02' 30, '顧客G', '『商品3』本申込', '2014-04-10 10:43:14' 25, '顧客B', '『商品2』本申込', '2014-04-05 14:58:41' 18, '顧客B', '『商品3』本申込', '2014-03-20 22:14:10' 16, '顧客B', '『商品1』本申込 / 変更4' '2014-03-18 21:07:34' 12, '顧客C', '『商品1』本申込 / 変更3' '2014-03-12 20:33:39' 7 , '顧客D', '『商品1』本申込 / 変更2' '2014-03-07 17:27:33' 4 , '顧客E', '『商品1』本申込', '2014-03-04 13:33:51'

    • ベストアンサー
    • MySQL
  • MySQLで顧客毎に最新のデータ順で表示

    以下のようなデータがあります。 id 顧客コード 日付 金額 1 A001 2012/12/25 100 2 B001 2012/12/24 200 3 A001 2012/12/24 100 4 C001 2012/12/23 500 5 A001 2012/12/23 300 6 B001 2012/12/23 100 このデータを、顧客毎に最新順で表示したいのです。 順番は、 1.最新の日付順に顧客がまず並ぶ 2.その顧客の並び順で、顧客毎に日付が新しい順に各データが並ぶ 説明が下手ですが、下の様に 1 A001 2012/12/25 100 3 A001 2012/12/24 100 5 A001 2012/12/23 300 2 B001 2012/12/24 200 6 B001 2012/12/23 100 4 C001 2012/12/23 500 A001、B001、C001の中で、最新の日付を持っているのがA001→B001→C001なので、その順で並ぶ。 (SELECT 顧客コード, MAX(日付) FROM tbl GROUP BY 顧客コード かな?) さらに、その顧客の中で日付順にデータが並ぶ。 このように抽出するには、どのようなSQL文で行うのでしょうか。 サブクエリを使うのかなとは思うのですが、あまり理解できていないため思いつきません。 わかるかたよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 商品Aと商品Bを購入したユーザーの取得

    こんにちは! 現在以下の状態でのsql作成に悩んでいます。 テーブルユーザー uid name 1 test1 2 test2 3 test3 購入履歴 id uid item 1 1 商品A 2 1 商品B 3 2 商品B 4 3 商品A 5 3 商品C の様なテーブルから商品Aと商品Bを購入した ユーザーのみを抽出したいと考えています。 恥ずかしながら見当も付かない状態です。 ポインタだけでも結構ですので ご教示頂けますようよろしくお願いいたします。

  • アクセス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関数を入れて最新データの抽出をしようとすると、全ての「発送」を除いたデータが抽出されるので、最新データに該当する顧客のデータが消えてしまいます。 なので、本来のコメントデータが分からない状態になります。 また、エクセル側でパラメータクエリを使って資料を作成し、アクセスに触ったことがない人たちが使用するので、アクセスを更新してといったことができません。 なので、更新クエリなどを使ってのやり方以外の方法はないでしょうか? 全くの初心者ですので、言葉足らずで説明が分かり辛くて申し訳ありません。 ご教示をお願いいたします。

  • 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で日付

    MySQLです。JAVAです。 下記に該当するレコード項目全てを抽出するには、 どのようなSQLを書けばよいでしょうか? 指定日 sitei_date = 2015-07-14 sampleテーブル -------------------- ID name date -------------------- 1 商品A 2015-07-07 1 商品A 2015-07-13 1 商品A 2015-07-14 ・・・ これを抽出したい 1 商品A 2015-09-11 2 商品B 2015-09-10 2 商品B 2015-07-15 2 商品B 2015-07-13 3 商品C 2015-07-07 3 商品C 2015-07-11

    • ベストアンサー
    • MySQL
  • エクセルの重複データを抽出し、最新のデータを残した

    エクセルの重複データを抽出し、最新のデータを残したいです。 A列 B列 1 aaa@aaaa.co.jp 2014/1/1 2 bbb@aaaa.co.jp 2013/1/2 3 aaa@aaaa.co.jp 2014/1/10 4 aaa@aaaa.co.jp 2014/10/10 A列にアドレス、B列に日付が入っているデータがあります。 (他にC列などにも顧客情報が入っています。) アドレスの重複データを抽出し、最新の日付の行が残るようにしたいです。 この場合ですと2と4が残るようにしたいです。 膨大なデータの為、困っています。 良い方法をご存知の方、よろしくお願い致します。

  • ACCESS 顧客データ 購入履歴検索について

    ACCESSで顧客データを管理しています。 ●月●日以降 ○○製品の購入履歴があった人が、 その日付以降に再来店しているか、再来店日、購入製品をだしたいのですが、 良い抽出方法ありますか? テーブルには、↓ があります。 顧客コード 顧客名 売上日付 取引番号 商品コード 商品名 売上数量 店舗名  分かる方いらしたら教えて下さい! 宜しくお願いします。

  • Mysqlで最新の日付を持つデータを取得するSQLを書きたい

    Mysqlで最新の日付を持つデータを取得するSQLを書きたい 管理テーブル(MySql) 日 付|食べたもの ----------- 4月1日|パン 4月2日|ご飯 4月3日|パン 4月4日|パン 4月5日|ご飯 4月6日|カレー と言ったデータがあったとき パンを食べた最新の日付を取得したいとき どんなSQLを書けばいいのでしょうか? SELECT * FROM 管理テーブル WHERE 食べたもの = パン ORDER BY 日付 DESC LIMIT 1; とすれば、思うような結果が出ましたが LIMITは使いたくありません また 日 付|食べたもの ----------- 4月4日|パン 4月5日|ご飯 4月6日|カレー 上記のように 食べたのもそれぞれの最新の日付を表示して 一覧にしたいとき(表現ベタですみません) どんなSQLになりますか?

    • ベストアンサー
    • MySQL
  • メインデータと最新サブデータのテーブル結合について

    お世話になっております。 MySQL4.1にて以下のようなデータを取得したいと考えています。 1回のSQLで何とかとりたいと考えているのですが、 良いお知恵はないでしょうか? ▼Aテーブル ID(PK) メインメモ ▼Bテーブル ID(PK) 日付(PK) サブメモ ▼取得したい結果 ID(1) メインメモ 最新サブメモ ID(2) メインメモ 最新サブメモ ID(3) メインメモ null ・「メインメモ」と「サブメモ」は1対多の状態です。 ・IDごとに1行だけメインメモと最新のサブメモを取得したい。 ・サブメモがなくてもメインメモだけでも取れる。  (Aテーブル LEFT OUTER JOIN Bテーブルの関係) 上記の条件でデータを取得したいと考えております。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL