下記の2つのテーブルより、各顧客が最後に売れた日を抽出したいのですがうまくいきません。


顧客テーブル
kokyaku_id
kokyaku_name

1
aaa
2
bbb
3
ccc
4
ddd

売上テーブル
uriage_date
kokyaku_id
kingaku

2000-1-1
1
100

2011-12-1
2
200

2010-2-2
2
300

2009-3-1
1
50

2006-5-29
3
300

2007
3
400

2012-9-20
3
100

kokyaku_name | uriage_date

aaa | 2009-3-1
bbb | 2011-12-1
ccc | 2012-9-20

顧客dddは売上がないので当然結果には出てこなくてOKです。

何結合でどのようなクエリにすればよろしいでしょうか。
まだDBを初めて2週間なので、ご教示お願い致します。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2012/02/15 23:30:56

ベストアンサー

id:jranar No.1

回答回数98ベストアンサー獲得回数29

こんな感じで(ソートはとりあえず顧客テーブルのkokyaku_idの昇順にしておきました)

select
a.kokyaku_name ,
max(b.uriage_date)
from
顧客テーブル as a inner join 売上テーブル as b on a.kokyaku_id=b.kokyaku_id
group by
a.kokyaku_name
order by
a.kokyaku_id asc
;

id:bon731

すごいわかりやすいクエリで納得もできました!ありがとうございます!

2012/02/15 23:27:12

その他の回答1件)

id:jranar No.1

回答回数98ベストアンサー獲得回数29ここでベストアンサー

こんな感じで(ソートはとりあえず顧客テーブルのkokyaku_idの昇順にしておきました)

select
a.kokyaku_name ,
max(b.uriage_date)
from
顧客テーブル as a inner join 売上テーブル as b on a.kokyaku_id=b.kokyaku_id
group by
a.kokyaku_name
order by
a.kokyaku_id asc
;

id:bon731

すごいわかりやすいクエリで納得もできました!ありがとうございます!

2012/02/15 23:27:12
id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149

MySQL、PostgreSQLの例
(GROUP BYするのは動作コストが高くなるので、単純に結合させてます)

SELECT kokyaku_name
, (SELECT uriage_date FROM t_uriage AS b WHERE b.kokyaku_id = a.kokyaku_id ORDER BY uriage_date DESC LIMIT 1) AS uriage_date
FROM m_kokyaku AS a;

別名にASを使っているということはAccessなのかもしれませんね・・・
Accessの例

SELECT kokyaku_name
, DMax("uriage_date", "t_uriage",  "kokyaku_id = " & kokyaku_id) AS uriage_date
FROM m_kokyaku AS a;

いずれも動作確認済みのものです

id:windofjuly

>顧客dddは売上がないので当然結果には出てこなくてOK

回答のSQLではdddも出てしまうので、
dddを出したくない場合は、下記を書き加えます
共通の方式

WHERE EXISTS(SELECT * FROM t_uriage AS b WHERE b.kokyaku_id = a.kokyaku_id)

Accessだけの方式

WHERE DLookup("uriage_date","t_uriage","kokyaku_id = " & [kokyaku_id]) <> ""

他にも書き方はありますので、回答も含めて一例に過ぎません
なお、以後質問をなさる場合には、必ずソフトの名前をバージョンを記載するようにしましょう

2012/02/15 21:37:16
id:bon731

ありがとうございます!GROUP BYすると動作が遅くなるのですね。勉強になります。すいません、バージョンは5.1でした。以後記載致します。

2012/02/15 23:30:42
  • id:tdoi
    何を試して、どううまくいかないのでしょうか?
  • id:bon731
    select kokyaku_name from m_kokyaku as a left join t_uriage as b on a.kokyaku_id=b.kokyaku_id where a.kokyaku_id;

    これで結合させてみましたが、先に進めません…

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません