- ベストアンサー
再来店検索の方法と注意点
- 再来店検索について、総来店人数と再来店人数を把握する方法について詳しく説明します。
- 再来店人数の合計を取得するための条件と、テンポラリテーブルを使用する方法についても解説します。
- また、Mysqlのバージョンによる制約として、副問い合わせが使用できない点にも言及します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
私は元々Oracleな人だったんで、 最初サブクエリーがないのでかなり困ってたんですが、 なれれば、どうにでもなるものですね。 #最近はMySQL大好きです。 下記は私ならこうする。ってパターンです。 もう少し格好いい方法があるかもしれませんが、 とりあえず、これでも算出できると思います。 -- テストデータ CREATE TABLE raiten (m_id char(8), dt date); insert into raiten values ("a01", '2004-07-01'), ("a01", '2004-08-02'), ("a01", '2004-09-01'), ("a01", '2004-10-01'), ("a02", '2004-07-02'), ("a02", '2004-10-10'), ("a03", '2004-07-10'), ("a03", '2004-11-01'), ("a03", '2004-12-01'), ("a04", '2004-07-01'), ("a04", '2005-07-02'), ("a05", '2004-07-01'), ("a05", '2004-08-02'), ("a06", '2004-09-02'), ("a07", '2004-07-15'), ("a07", '2004-09-02'); まず、集計対象となる月の顧客をリストアップします。 CREATE TEMPORARY TABLE summary_base SELECT * FROM raiten WHERE dt BETWEEN '2004-7-01' and '2004-07-31'; その後、ユーザーごとに集計対象月以降の最小の日付を求め、 何ヶ月経過したか計算します。 2004と7を引き算していますが、これは集計対象の月を入れます。 適宜集計ごとに編集が必要です。 @syukeibiみたいに変数を使うとベター (もうちょっとスマートな方法があるかも。) CREATE TEMPORARY TABLE user_syukei SELECT r.m_id, (YEAR(MIN(r.dt)) - 2004) * 12 + MONTH(MIN(r.dt)) - 7 as sairaiten_tuki FROM raiten r INNER JOIN summary_base s ON ( r.m_id = s.m_id ) WHERE r.dt > '2004-07-31' GROUP BY r.m_id 準備完了です。 あとは、それぞれ集計します。 4ヶ月以降が必要なければ、ここで消し込みを入れてください。 SELECT CONCAT(sairaiten_tuki, 'ヶ月後来店人数') AS '月', CONCAT(count(m_id), '人') AS '来店人数' FROM user_syukei GROUP BY sairaiten_tuki これは簡単ですね。サマリーです。 SELECT '再来店人数合計' AS '月', CONCAT(count(*), '人') AS '来店人数' FROM user_syukei
お礼
ご回答ありがとうございます。 このようなやり方もあるんですね。 なんとなくできそうですが、条件が少し満たしていないので補足します。 テストデータは以下のようなものを使用します。 CREATE TABLE raiten (m_id char(8), dt date); insert into raiten values ("a01", '2004-07-01'), ("a01", '2004-08-02'), ("a01", '2004-09-01'), ("a01", '2004-10-01'), ("a02", '2004-07-02'), ("a02", '2004-10-10'), ("a03", '2004-07-10'), ("a03", '2004-11-01'), ("a03", '2004-12-01'), ("a04", '2004-07-01'), ("a04", '2005-07-02'), ("a05", '2004-07-01'), ("a05", '2004-08-02'), ("a06", '2004-09-02'), ("a07", '2004-06-10'), ("a07", '2004-07-15'), ("a07", '2004-09-02'), ("a08", '2004-07-15'), ("a09", '2004-07-05'), ("a09", '2004-07-15'), ("a09", '2004-07-30'), ("a09", '2004-08-15'), ("a09", '2004-09-15'), ("a09", '2004-10-15'), ("a10", '2004-07-15'), ("a10", '2004-07-06'), ("a10", '2004-09-15'); ・同じ月に複数回来店することもある。 ・該当月に来店していて、以後来店されない場合がある。 やり方を教えていただいたので、あとは自分で工夫しながらやってみます。 ありがとうございました。 自分でできたら報告します。
補足
できましたー! ## 顧客をリストアップ。 # ここを入れないとa10が7/15を取ってしまう・・・ ORDER BY と GROUP BY を一緒に使うと正常に動作しないのかい? CREATE TEMPORARY TABLE raiten2 SELECT * FROM raiten WHERE dt LIKE '2004-07-%' ORDER BY dt; # 該当月初回来店日を入れる CREATE TEMPORARY TABLE summary_base SELECT * FROM raiten2 WHERE dt LIKE '2004-07-%' GROUP BY m_id; ## 経過月をおいれますす CREATE TEMPORARY TABLE user_syukei SELECT r.m_id,(YEAR(MIN(r.dt)) - 2004) * 12 + MONTH(MIN(r.dt)) - 7 as sairaiten_tuki FROM raiten r INNER JOIN summary_base s ON ( r.m_id = s.m_id ) WHERE r.dt != s.dt and r.dt > s.dt GROUP BY r.m_id ORDER BY r.dt 以下は同じ。 初回来店日当日に複数回来ることもありますが、 当日に来店した場合は翌日から検索することにしました。 思ったとおりの動作をさせることができました。 ありがとうございました。