人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

下記の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週間なので、ご教示お願い致します。



●質問者: bon731
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● くろふね
ベストアンサー

こんな感じで(ソートはとりあえず顧客テーブルの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
;


bon731さんのコメント
すごいわかりやすいクエリで納得もできました!ありがとうございます!

2 ● うぃんど

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を出したくない場合は、下記を書き加えます 共通の方式 >|sql| WHERE EXISTS(SELECT * FROM t_uriage AS b WHERE b.kokyaku_id = a.kokyaku_id) ||< Accessだけの方式 >|sql| WHERE DLookup("uriage_date","t_uriage","kokyaku_id = " & [kokyaku_id]) <> "" ||< 他にも書き方はありますので、回答も含めて一例に過ぎません なお、以後質問をなさる場合には、必ずソフトの名前をバージョンを記載するようにしましょう

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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ