ACCESSクエリーで注文日、会員番号、購入回数、LTVを表示する方法

このQ&Aのポイント
  • ACCESSクエリーを使用して、注文日、会員番号、購入回数、LTVを表示する方法について教えてください。
  • 注文データを示すテーブル名「table1」から、注文日ごとに同じ会員番号の購入回数とLTVを計算し、表示したいです。
  • LTVは注文日と最初の注文日との日数の差を表し、購入回数は同じ注文日であっても複数の商品を購入していても同じ数として計算します。
回答を見る
  • ベストアンサー

●最終系:ACCESSクエリーの件!懇願mm

ACCESSクエリーで教えていただきたいことございます! 以下に関連しております。大変恐縮です。 ↓ http://okwave.jp/qa/q8756016.html ●したいこと● 累積回数、LTVを導きたいです(自動算出)。 ●何から?● 以下データ群(テーブル名:table1)があります(会員番号はユニークをあらわします)。 注文日   会員番号  商品名  価格 2014/04/11 123456 パンツ  1000 ←一番古い注文日の行(4/11開始)が先頭 2014/04/20 123456 靴下   3000 2014/05/23 456789 半袖   2000 2014/05/23 456789 靴下   3000 2014/05/29 456789 パンツ  1000 2014/05/30 987654 靴下   3000 2014/06/09 987654 寝巻き  5000 2014/06/15 987654 下駄   4000 ●SQLクエリーで導きだしたいこと● 上記データ群を、SQL(クエリー)を使用して、 以下のように表現できないでしょうか。 注文日   会員番号  購入回数  LTV  ※商品名も表示できればそのままつけたい 2014/04/11 123456      1     0 2014/04/20 123456   2 9 2014/05/23 456789     1     0 2014/05/23 456789   1 0 2014/05/29 456789   2 6 2014/05/30 987654      1 0 2014/06/09 987654   2 10 2014/06/15 987654     3 16 ※同じ注文日、同じ会員番号であれば、商品を複数購入しようが(複数行であっても)それは同日扱いにより購入回数は同じと数とする ※LTV:その回の注文日 - 最初(1回目)の注文日(最初の購入から見て何日経過か) ※ユニーク(会員番号)の方が、一度にいくつ購入したかは問わず、 何日おき(すべて初回を起点にした経過日とする)に来店したか、頻度と合わせて表現したい ※積み上がる累積金額の表示はなくてかまわないので、上記(購入回数、LTV)2つを表示できないでしょうか。 お知恵をいただければ幸いですmm LTV算出は以下のイメージが近いです。 ↓↓↓↓↓↓↓↓↓↓↓ http://okwave.jp/qa/q8756016.html なお、LTV を求める記述の Max(Q2.注文日) を Min(Q2.注文日) とすると 表示結果は、 会員番号  購入回数  LTV 123456  1  0 123456  2  31 123456  3  61 456789  1  0 456789  2  31

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

楽しいですか テーブル名を ★★ 以下をクエリのSQLビューで SELECT Q1.注文日, Q1.会員番号, Count(Q2.会員番号)+1 AS 購入回数, DateDiff('d', Nz(Min(Q2.注文日),Q1.注文日), Q1.注文日) AS LTV FROM (SELECT 会員番号, 注文日 FROM ★★ GROUP BY 会員番号, 注文日) AS Q1 LEFT JOIN (SELECT 会員番号, 注文日 FROM ★★ GROUP BY 会員番号, 注文日) AS Q2 ON Q1.会員番号=Q2.会員番号 AND Q1.注文日>Q2.注文日 GROUP BY Q1.会員番号, Q1.注文日; 変更部分はそうないですね 結果は 注文日 会員番号 購入回数 LTV 2014/04/11 123456 1 0 2014/04/20 123456 2 9 2014/05/23 456789 1 0 2014/05/29 456789 2 6 2014/05/30 987654 1 0 2014/06/09 987654 2 10 2014/06/15 987654 3 16 2014/05/23 456789 1 0 部分は2行必要&商品名も欲しいのなら SELECT Q4.注文日, Q4.会員番号, Q4.商品名, Q3.購入回数, Q3.LTV FROM (SELECT Q1.注文日, Q1.会員番号, Count(Q2.会員番号)+1 AS 購入回数, DateDiff('d', Nz(Min(Q2.注文日),Q1.注文日), Q1.注文日) AS LTV FROM (SELECT 会員番号, 注文日 FROM ★★ GROUP BY 会員番号, 注文日) AS Q1 LEFT JOIN (SELECT 会員番号, 注文日 FROM ★★ GROUP BY 会員番号, 注文日) AS Q2 ON Q1.会員番号=Q2.会員番号 AND Q1.注文日>Q2.注文日 GROUP BY Q1.会員番号, Q1.注文日) AS Q3 LEFT JOIN ★★ AS Q4 ON Q3.会員番号=Q4.会員番号 AND Q3.注文日=Q4.注文日 ORDER BY Q4.会員番号, Q4.注文日 ; の表示は 注文日 会員番号 商品名 購入回数 LTV 2014/04/11 123456 パンツ 1 0 2014/04/20 123456 靴下 2 9 2014/05/23 456789 半袖 1 0 2014/05/23 456789 靴下 1 0 2014/05/29 456789 パンツ 2 6 2014/05/30 987654 靴下 1 0 2014/06/09 987654 寝巻き 2 10 2014/06/15 987654 下駄 3 16 ※ > 一番古い注文日の行(4/11開始)が先頭 これについては考えてください。 現状、会員番号昇順を1番目に指定しているので、上記は、タマタマ 注文日昇順を1番目にすると、会員番号がバラバラになります ユーザ定義関数でも作って、 注文日昇順にした際、会員番号が並ぶ様に細工してください。 処理的には、 会員番号でグループ化した際の最小注文日を求めて、 その注文日を昇順にした会員番号の並び順でソートする様に ソート( ORDER BY )指定は、この関数の戻り値、次に注文日昇順で ※ 後だしで、会員番号の発行は小さい順、なら無駄な記述ですけど ※ 処理性能的にはどうなんですか?   何レコードのテーブルで、   購入回数の最大・平均、   クエリを開いて表示されるまで何秒とか   報告ある事を期待します   遅くて、使いものにならないので、カテゴリを変えて質問し直した   って事になるのでしょうか?

jordan232011
質問者

お礼

ありがとうございます。 > これについては考えてください。 現状、会員番号昇順を1番目に指定しているので、上記は、タマタマ 注文日昇順を1番目にすると、会員番号がバラバラになります 上記はあらかじめテーブルに会員番号順、注文日別でソートしたデータを組み込んでおこうと おもいます、時間が限られているため。試してみます!結果のちほど。 ※この返信が的はずれであればご指摘いただければ幸いです。

jordan232011
質問者

補足

30246kiku様 全く問題なかったです。多少クエリーの実行に時間を要しましたが40万レコードでストレスなく 集計できました。また、あらかじめテーブルに会員番号順、注文日別でソートしたデータを組み込んでおくことで会員番号がバラバラになるリスクが回避できています。 秀逸、実用的です。ありがとうございました。

関連するQ&A

  • ACCESS SQLクエリーの活用について

    以下データ群(テーブル名:table1)があります(会員番号はユニークをあらわします)。 注文日   会員番号  商品名  価格 2014/04/11 123456 パンツ  1000 ←一番古い注文日の行(4/11開始)が先頭 2014/04/20 123456 靴下   3000 2014/05/23 456789 半袖   2000 2014/05/23 456789 靴下   3000 2014/05/29 456789 パンツ  1000 2014/05/30 987654 靴下   3000 2014/06/09 987654 寝巻き  5000 2014/06/15 987654 下駄   4000 そして、 SELECT Q4.注文日, Q4.会員番号, Q4.商品名, Q3.購入回数, Q3.LTV FROM (SELECT Q1.注文日, Q1.会員番号, Count(Q2.会員番号)+1 AS 購入回数, DateDiff('d', Nz(Min(Q2.注文日),Q1.注文日), Q1.注文日) AS LTV FROM (SELECT 会員番号, 注文日 FROM ★★ GROUP BY 会員番号, 注文日) AS Q1 LEFT JOIN (SELECT 会員番号, 注文日 FROM ★★ GROUP BY 会員番号, 注文日) AS Q2 ON Q1.会員番号=Q2.会員番号 AND Q1.注文日>Q2.注文日 GROUP BY Q1.会員番号, Q1.注文日) AS Q3 LEFT JOIN ★★ AS Q4 ON Q3.会員番号=Q4.会員番号 AND Q3.注文日=Q4.注文日 ORDER BY Q4.会員番号, Q4.注文日 ; 達人からアドバイスいただいていた 上記SQLクエリーからの表示は 注文日 会員番号 商品名 購入回数 LTV 2014/04/11 123456 パンツ 1 0 2014/04/20 123456 靴下 2 9 2014/05/23 456789 半袖 1 0 2014/05/23 456789 靴下 1 0 2014/05/29 456789 パンツ 2 6 2014/05/30 987654 靴下 1 0 2014/06/09 987654 寝巻き 2 10 2014/06/15 987654 下駄 3 16 と出ます(GOOD!!!)。 上記に付随して、 このクエリーが参照しているテーブルの他の列(例:氏名、都道府県)もある(集計対象ではない)場合でそれも追加で(列名:氏名、都道府県を)表現するためには、 SELECT Q4.注文日, Q4.会員番号, Q4.商品名, Q3.購入回数, Q3.LTV の構文箇所に2つの列名も手打ちで追加する必要がありますでしょうか。 (テーブル列名すべてを表示する・・といった個別に列名を指定しないで表示する方法はあるのでしょうか<列名が多いときに手間が若干かかる)

  • ACCESSデータは5000以上ある(抽出の件)

    データは5000件以上あるのですが、以下で対応は難しいのではないでしょうか。 ソートでできますでしょうか?↓ http://okwave.jp/qa/q8755953.html ●質問した内容● ACCESSを活用して累計(経過)を表現したい 質問者:jordan232011 投稿日時:2014/09/15 21:38 困ってます ACCESSテーブルに以下情報が格納されています。 注文日    会員番号  商品名  価格 2014/03/23  123456 サンプル  500円 2014/04/23  123456 サンプル  500円 2014/05/23  123456 サンプル  500円 2014/03/21  456789 容器    1000円 2014/04/21  456789 容器    1000円 上記をクエリーを利用して、以下の抽出をする方法は ないでしょうか。 ↓ (1) 会員番号 購入回数 価格 累積価格 123456     1 500 500 123456    2 500 1000 123456   3 500 1500 456789   1 1000 1000 456789   2 1000 2000 (2) 会員番号 購入回数 LTV 123456      1 0 123456    2 30 123456    3 60 456789    1 30 456789   2 60 ※LTV:その回の注文日 - 前の注文日 ※必要であれば先頭にAUTOナンバーをつけることも可能 ※ACCESS2010を利用中 お手数ですが御教授いただけるとたすかります。。

  • ACCESSを活用して累計(経過)を表現したい

    ACCESSテーブルに以下情報が格納されています。 注文日    会員番号  商品名  価格 2014/03/23  123456 サンプル  500円 2014/04/23  123456 サンプル  500円 2014/05/23  123456 サンプル  500円 2014/03/21  456789 容器    1000円 2014/04/21  456789 容器    1000円 上記をクエリーを利用して、以下の抽出をする方法は ないでしょうか。 ↓ (1) 会員番号 購入回数 価格 累積価格 123456     1 500 500 123456    2 500 1000 123456   3 500 1500 456789   1 1000 1000 456789   2 1000 2000 (2) 会員番号 購入回数 LTV 123456      1 0 123456    2 30 123456    3 60 456789    1 30 456789   2 60 ※LTV:その回の注文日 - 前の注文日 ※必要であれば先頭にAUTOナンバーをつけることも可能 ※ACCESS2010を利用中 お手数ですが御教授いただけるとたすかります。。

  • 再 ACCESSのソートについて(必要なものだけ

    テーブルにあるデータを以下のようにクエリーでソートしたく。 会員番号をユニークIDとする ○テーブルにあるデータ 注文日      会員番号  購入額   購入回数 2014/03/05   12345678   3675     10 2014/03/05   12345678   3675      9 2014/03/05   98765241   3675      3 上記について会員番号が同一であれば、購入回数が 最大のものだけを行表示させる(以下)ことは 可能でしょうか。 注文日      会員番号    購入額   購入回数 2014/03/05   12345678 3675    10 2014/03/05   98765241 3675     3 会員番号が重複している行は購入回数が最大の数の行だけ残したい。 (重複ありなし混在で1万ほどレコードがある) お手数をおかけします!

  • 歯抜けとなっている特定の会員だけを特定したい

    注文日 会員番号   商品名     価格    注文番号    購入回数 2014/3/2 123345678    お好み焼き     550  201401123   1 上記行毎の注文データがxlsで1万件(行)あります。 (「購入回数」は日別で注文された累積件数をあらわします。1=初回 2=2回目 最大5迄ふられている) <問題> 同じ会員番号のデータで、購入回数[1]がないにもかかわらず、購入回数2以降~から存在する不要な データが混ざっています。 この購入回数1がないのに、同じ会員番号で購入回数が2~5いずれかをふられている行(会員)だけを ピックアップする方法はないでしょうか。xls上でもアクセスにインポートしてからの 処理でもどちらでもかまわないのですが。 いわゆるこの不要データを削除(クリーニング)したいのです。 お知恵をいただけるとありがたいですmm

  • ACCESSかエクセルで抽出したいmm(再掲載)

    以下出荷データ(xls.)があるのですが、同じ「会員番号」で見て、購入回数別で 「商品名・区分の両方ないしはいずれか」が1回目と変わっているデータ(会員番号)は 1回目含めて除外、ないしは目印をつけたいの ですが、EXCEL、ないしはACCESSで行う方法ないでしょうか。 ※浮気をしないで一貫しておなじ「商品名・区分」を貫いているお客(恋人)だけを 引っ張り出したいmm 購入回数1しかない顧客は浮気対象ではない(除外しない) 以下は出荷履歴の一部を切り取ったものです(これを活用したい) EXCELでできてしまうのか?ACCESS SQLがいいのか? 注文日       会員番号    商品名      区分     購入回数 2014/03/01     12345678    セレクト    通常購入    1 2014/04/01     98765432    通常商品    定期購入    1 2014/04/10      33333333    通常商品 通常購入 1 2014/05/20      77777777    セレクト 通常購入 1 2014/06/20      77777777    セレクト    通常購入    2 2014/07/20     77777777    セレクト    通常購入    3 2014/08/20     77777777    シリーズ    通常購入    4 2014/09/20     77777777    セレクト    通常購入    5 方法悩んでおりますmmmm 商品名・区分はそれぞれ商品名が上記3種類、区分は2種類しかないので、 これを数字に変換してもかまわない(整理ができればいいので)。 さすがに難しいですよねmmmm

  • 【Accessクエリ】存在しないデータを0として計算させるには?

    手数料テーブル(注文番号→手数料) ─────── 1  500 3  500 11  500 受注テーブル(注文番号→単価、数量) ────── 1   64,000  3 2  248,000  1 3   82,000  1 4  110,000  4 クエリ 総額: 単価 * 数量 + 手数料 とすると、注文番号2,4の総額は表示されません。 この場合、受注テーブル内に手数料フィールドをつくり、全レコードに手数料フィールドをもたせるしかないのでしょうか? 手数料=0として、正しく計算してほしいところなのですが...

  • ACCESS初心者です。

    ACCESSで会員名簿を作成しています。 『テーブル名簿』に会員番号・氏名・住所・電話番号などを入力しています。 『テーブル利用状況』に利用者全員の日付・会員番号を入力しています。 今までの利用回数が3回以内の会員にダイレクトメールを送付しようと考えております。 利用回数3回以内の人の氏名と住所を会員番号で照合して抽出することは可能でしょうか? 現在お恥ずかしながら私の知識ではテーブルからクエリを作成するというところまでです。 他の質問を見てみたのですが、どうも例から応用させるということができず、質問させていただきました。 どうかお答えいただけますようお願いします<(_ _)>

  • 集計クエリについて

    注文データ ・注文番号(重複なし) 商品テーブル ・商品コード ・商品名 実績1 ・注文番号 ・商品コード ・出庫日 ・使用重量 実績2 ・注文番号 ・商品コード ・出庫日 ・使用重量 上記4つのテーブルがあり、それぞれ下記の内容が入っています。 注文データ A01 A02 A03 A04 商品テーブル S01 あずき S02 いちご S03 りんご 実績1 A01 S01 2015/9/1 10.00 A02 S02 2015/9/2 10.00 A04 S01 2015/9/4 10.00 実績2 A01 S01 2015/9/1 10.00 A03 S03 2015/9/3 10.00 A04 S01 2015/9/4 10.00 クエリを使用して実績1と実績2を下記のように集計するにはどのようにしたら良いでしょうか。 一つのクエリ内で処理したいです。 集計クエリ結果 S01 あずき 20.00 S02 いちご 10.00 S03 りんご 10.00

  • クエリのスピードアップ方法

    windows2000 access2002 在庫テーブル  日付、店番号、商品番号、個数 商品マスタ  商品番号、売価、原価 これらのテーブルを使い以下のクエリ1を作成しました。  日付、店番号、商品番号、在庫原価:個数*原価 さらにこのクエリを使い以下のクエリ2を作成しました。  日付、店番号、在庫原価の合計 クエリ1は実行するとサクっと表示されるのですが、クエリ2は実行してから20秒から30秒待たないと表示されません。現在のレコード320万件です。この件数は2倍から5倍に増える予定ですので、現時点でこの速度では件数が増えたときが心配です。 しかしテーブルは他のシステムでも使用しているので、手を加えることはできません。 なんとかもう少し早く表示させる方法はないでしょうか。 よろしくお願いします。

専門家に質問してみよう