顧客テーブル
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週間なので、ご教示お願い致します。
こんな感じで(ソートはとりあえず顧客テーブルの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
;
こんな感じで(ソートはとりあえず顧客テーブルの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
;
すごいわかりやすいクエリで納得もできました!ありがとうございます!
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;
いずれも動作確認済みのものです
>顧客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]) <> ""
他にも書き方はありますので、回答も含めて一例に過ぎません
なお、以後質問をなさる場合には、必ずソフトの名前をバージョンを記載するようにしましょう
ありがとうございます!GROUP BYすると動作が遅くなるのですね。勉強になります。すいません、バージョンは5.1でした。以後記載致します。
すごいわかりやすいクエリで納得もできました!ありがとうございます!
2012/02/15 23:27:12