• 締切済み

注文のリピート数をカウントしたい

受注テーブルがあって、注文日付があるテーブルがあるのですが、例えば以下のような簡易なテーブルがあったとします。 id unique, kokyaku_id bigint, order_date datetime 2015年4月~翌年3月までの月毎のリピーターの数を知りたいとき、どのように抽出すればいいでしょうか。 データは2015年以前から入っているとして、2015年4月には、過去すべての注文テーブル上から検索して初めて購入した人は○人、複数回購入したことがある人は○人というのを知りたいです。 ちょっと複雑な気がするのですが、何かおわかりの方はよろしくお願いします。

  • MySQL
  • 回答数6
  • ありがとう数0

みんなの回答

  • maiko333
  • ベストアンサー率47% (9/19)
回答No.6

2010年1月1日~2016年3月31日のデータで、2015年4月から2016年3月に初めて購入された方は○人、 2010年1月1日~2016年3月31日のデータで、2015年4月から2016年3月に2回以上購入された方は○人。 で良ければ select 年月, 回数, count(*) from ( select substr(order_date,1,6) as 年月, '1' as 回数, kokyaku_id from 受注テーブル where order_date between '20150401' and '20160331' and kokyaku_id not in ( select kokyaku_id from 受注テーブル where order_date between '20100101' and '20150331') group by substr(order_date,1,6), kokyaku_id having count(*) = 1 union select substr(order_date,1,6) as 年月, '2' as 回数, kokyaku_id from 受注テーブル where order_date between '20150401' and '20160331' and kokyaku_id not in ( select kokyaku_id from 受注テーブル where order_date between '20100101' and '20150331') group by substr(order_date,1,6), kokyaku_id having count(*) >= 2) group by 年月, 回数" となります。

ok-rjak
質問者

補足

それを、4月に初めて購入された方は○人、2回以上購入された方は○人、5月に初めて購入された方は○人、2回以上購入された方は○人、6月・・・、7月・・・、翌3月というのは無理でしょうか?

  • maiko333
  • ベストアンサー率47% (9/19)
回答No.5

select 年月, 回数, count(*) from ( select substr(order_date,1,6) as 年月, '1' as 回数, kokyaku_id from 受注テーブル where order_date between '20150401' and '20150430' and kokyaku_id not in ( select kokyaku_id from 受注テーブル where order_date between '20100101' and '20150331') group by substr(order_date,1,6), kokyaku_id having count(*) = 1 union select substr(order_date,1,6) as 年月, '2' as 回数, kokyaku_id from 受注テーブル where order_date between '20150401' and '20150430' and kokyaku_id not in ( select kokyaku_id from 受注テーブル where order_date between '20100101' and '20150331') group by substr(order_date,1,6), kokyaku_id having count(*) >= 2) group by 年月, 回数 いかがでしょうか? 条件について不明瞭だったのでこちらで判断しています。 2010年1月1日~2016年3月31日のデータで、2015年4月に初めて購入された方は○人、 2010年1月1日~2016年3月31日のデータで、2015年4月に2回以上購入された方は○人。 と出てきます。

ok-rjak
質問者

補足

ありがとうございます! 条件についてはその通りです。こちらのデータで件数の正否は不明ですが、カウントされているのが確認できました。 あと、これは追加?になるのですが、4月~翌3月まで1回のSQL文で出すことは可能ですか?

  • maiko333
  • ベストアンサー率47% (9/19)
回答No.4

「複数回購入したことがある人」を 1回○人2回以上○人としたいならNO1を、 1回○人2回○人3回○人4回○人・・・としたければNo3を選択してください。

回答No.3

【補足】最終的に[Orders クエリ]をサブクエリにすればOKです。 SELECT X.OrederCounter, COUNT(*) AS 注文者数 FROM [SELECT Customer_ID, Count(*) AS OrederCounter FROM Orders GROUP BY Customer_Id]. AS X GROUP BY X.OrederCounter; これが、目的のSQL文かと思います。

ok-rjak
質問者

補足

下にも書きましたが、利用したいデータの期間と集計したい期間が異なるのですが、それでも可能は方法はご存じでしょうか。 示していただいた方法も、今後使えると思いますので、参考にさせていただきます。

回答No.2

[Orders クエリ] SELECT Customer_ID, Count(*) AS OrederCounter FROM Orders GROUP BY Customer_Id; 次に SELECT [Orders クエリ].OrederCounter, COUNT(*) AS 注文者数 FROM [Orders クエリ] GROUP BY [Orders クエリ].OrederCounter; で、最終的に[Orders クエリ]をサブクエリにすればOKです。

ok-rjak
質問者

補足

細かく回数ごとに人数が出るのはありがたいですが、その期間で、月ごとに新規とリピーターの人数を知りたいです。

  • maiko333
  • ベストアンサー率47% (9/19)
回答No.1

select 回数, count(*) from ( select '1' as 回数, kokyaku_id from 受注テーブル where order_date between '20150401' and '20160331' group by kokyaku_id having count(*) = 1 union select '2' as 回数, kokyaku_id from 受注テーブル where order_date between '20150401' and '20160331' group by kokyaku_id having count(*) >= 2) group by 回数 ですね。

ok-rjak
質問者

補足

こちらの意図通り、1回のみ購入されている方と、2回以降購入されている方の人数がわかっていいのですが、月ごとのそれぞれの人数が知りたいです。 あと、集計したい期間と、データ期間が違うのですがわかりますか。 2010年1月1日~2016年3月31日のデータで、2015年4月に初めて購入された方は○人、2回以上購入された方は○人とは可能でしょうか。

関連するQ&A

  • SQLのSELECT文について

    以下の注文テーブルで、注文件数と送料と注文合計金額を一度に取得する場合、以下のようなSQL文で合っていますか? "SELECT order.total, order.delivery_fee, SUM(order.total * order.tax) AS total_for_paying FROM order"; CREATE TABLE `order` ( `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, `status` tinyint(3) UNSIGNED NOT NULL DEFAULT '0', `order_payment_status` tinyint(3) UNSIGNED NOT NULL DEFAULT '0', `buyer_id` bigint(20) UNSIGNED NOT NULL, `discount` INT(11) UNSIGNED NOT NULL, `delivery_fee` INT(11) UNSIGNED NOT NULL, `charge` INT(11) UNSIGNED NOT NULL, `total` INT(11) UNSIGNED NOT NULL, `tax` INT(11) UNSIGNED NOT NULL, `total_with_tax` INT(11) UNSIGNED NOT NULL, `total_for_paying` INT(11) UNSIGNED NOT NULL, `use_point` INT(11) UNSIGNED NOT NULL, `created` DATETIME NOT NULL, `updated` DATETIME NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

    • ベストアンサー
    • MySQL
  • MySQLでのINDEXの貼り方

    MySQLでのINDEXの貼り方にてご教示いただきたく思います。。 現在、ブログサイトを作っていて、記事ID毎にSNSでシェアされた数を保存する仕組みを作っています。 ストレージエンジン = InnoDB を設定しています。 post_idに同じIDが無い場合はINSERTし、ある場合はUPDATEとなります。 検索をかけるSELECT文の想定は以下の2つだと思っています。 SELECT * FROM tablename WHERE post_id = 1234; SELECT facebook FROM tablename WHERE post_id = 5678 作成したテーブル構造は以下になっています。 名前 | データ型 | 属性 | NULL | デフォルト値 | その他 ID | bigint(20) | UNSIGNED | いいえ | なし | AUTO_INCREMENT post_id | bigint(20) | UNSIGNED | いいえ | 0 facebook | bigint(20) | UNSIGNED | いいえ | 0 twitter | bigint(20) | UNSIGNED | いいえ | 0 googleplus | bigint(20) | UNSIGNED | いいえ | 0 pocket | bigint(20) | UNSIGNED | いいえ | 0 pinterest | bigint(20) | UNSIGNED | いいえ | 0 hatena | bigint(20) | UNSIGNED | いいえ | 0 line | bigint(20) | UNSIGNED | いいえ | 0 total | bigint(20) | UNSIGNED | いいえ | 0 datetime | datetime | | いいえ | 0000-00-00 00:00:00 リレーションは行う予定は無いのですが行うかもしれません。 分からないながらもINDEXを設定 ( 添付画像参照 ) してみました。 ご指導ご教示の程よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • [MySQL] UNIQUE制約の値を更新する方法

    表題にUNIQUE制約の値を「更新」する方法とありますが、 正確にはUNIQUE制約が設定された値を「入れ替える」方法について質問します。 あるテーブルに order という並び順(数値)を格納するカラムがあるとします。※このテーブルのプライマリーキーは id とします。 並び順ですので一意な値です。よって、order にUNIQUE制約を設定しています。 例えば 1~5 個のデータ(フィールド)があったとして、並び順も 1~5 あるわけですが、この並び順を入れ替える場合、並び順を格納しているカラム( order )にUNIQUE制約があるため、それぞれ UPDATE で上書きすることができません。 つまり、{ id: 1, order: 1 } というデータと { id: 2, order: 2 } というデータの並び順( order )を { id: 1, order: 2 } と { id: 2, order: 1 } というように入れ替えようとする場合、並び順( order )は一意であるため、UPDATE で上書きができないのです。 できればトランザクション内で処理したいのですが、これらの処理をスマートに更新する方法はないでしょうか。それとも、並び順( order )にUNIQUE制約を設定せず、アプリケーション側で並び順( order )を一意に保つよう実装するしかないでしょうか。

    • ベストアンサー
    • MySQL
  • 注文した商品名をマスターで作るか

    Access 2013 vba 今工事のための材料の注文履歴を保存するテーブルと画面を作っています。 この商品名や、単価、仕入れ値などのデータは、管理テーブルを作成してそこで管理し、そこから商品IDを選択すると、注文履歴の画面にIDだけがセットされるような作りにしようと考えています。 【注文内容の入力画面A】 ・注文日 ・受注ID ・商品ID ・注文先ID ・単価 ・数量 ・単位 【商品管理テーブル】 ・商品ID ・メーカーID ・単価 ・品番 このようにすると、商品管理のテーブルのレコードを勝手に削除されたりした場合に、大変な事になることを考えると躊躇してしまいます。 商品管理のテーブルはあくまでも参照にとどめて、その商品名や品番などは、注文履歴を保存する画面のフィールドに保存したほうが良いか、迷っています。 この点で良いアドバイスがあれば、よろしくお願いします。

  • ACCESSの同時にデータ入力★初心者です★

    いつも利用させていただいております 今回も困っております どうかお助け下さい windows XP と access 2000 です 製造業をしておりますが、お歳暮やお中元などの ギフト商材も作って売ろうと考えております 個別のお客さまへの細かな対応などに データベースを活用していきたいと考えております 商品を受注したときに、 4つのテーブルにデータを入力して管理したいと考えております 1.受注テーブル(受注ID、受注日、商品ID、購入者ID、発送先ID) 2.商品テーブル(商品ID、商品名)  ※すでに入力済 3.購入者テーブル(購入者ID、購入者名) 4.発送先テーブル(発送先ID、発送先名) これで、受注テーブルに打ち込むときに 一度に2~4も打ち込んでしまいたいです 3~4をあらかじめ打ち込んでからとか していると、多くの注文が来たとき 混乱してしまいそうです ルックアップウイザードを使う方法も考えたのですが、ほかに良い方法がありそうな気がして… よろしくお願いします

  • 時間を自動計算してディフォルトに設定

    以下のようなテーブルを作りたいと思うのですが、 CREATE TABLE hogeTBL ( id bigint(20) NOT NULL AUTO_INCREMENT, product_code varchar(20) NOT NULL default, start_time datetime NOT NULL default '0000-00-00 00:00:00', end_time datetime NOT NULL default '0000-00-00 00:00:00', sub_time datetime NOT NULL default(ここにend_time-start_timeの値を設定したい), PRIMARY KEY (id) ) TYPE=MyISAM; 見たとおり、インサート時、sub_timeのところに自動で end_time - start_time の、差分値が挿入されるようにしたいのですが、構文が思いつきません。 そもそもこういったことはCreate Tableで可能なのでしょうか・・・? サーババージョンは4.1.22です。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • accessのレポートで困ってます。

    受注伝票を印刷するためのレポートを作っていますが 複数商品を購入した際に購入商品を全て表示させる方法が分かりません。 Access2002で受注管理のテンプレートを 自分なりにカスタマイズして使っています。 受注に関するテーブルは3つあります。 関連するフィールドは下記の通りになっています。 【受注】  受注ID … key   【商品】  商品ID … key  商品名  単価 【受注明細】  受注明細ID … key  受注ID … 受注テーブルの受注IDと一対多  商品ID … 商品テーブルの商品IDと一対多  数量  単価 レポートには、複数商品を購入した場合に 全ての商品名と購入数、価格を表示させたいと思います。 どうぞよろしくお願いいたします。

  • access 1対1と1対多のテーブルをクエリで集計したい…

    受注管理のデータベースを作っています。 売り上げを計算するクエリを作ったのですがどうもうまくいかないので質問します。 集計したいテーブルですが 受注マスタテーブル 注文番号(主キー テキスト型) 注文日(日付型) 氏名 : : 受注明細マスタテーブル 注文番号 (重複あり)受注マスタの注文番号と1対多のリレーションシップ 商品名 品番 販売単価 購入個数 経費・返品金額テーブル 注文番号(主キー)受注マスタの注文番号と1対1のリレーションシップ 経費 返品金額 これを、販売単価×購入個数-経費+返品金額というようにして1ヵ月ごとに集計しようとして、下のようなクエリを作ったのですが経費が何回も計算されてうまくいきませんでした… よろしくお願いします。 SELECT Format(注文者マスタ!注文日,"yyyy/mm") AS 月, Sum([受注明細マスタ]![販売単価]*[受注明細マスタ]![購入数量]-[経費・返品金額テーブル]![経費]+[経費・返品金額テーブル]![返品金額]) AS 売上 FROM (注文者マスタ RIGHT JOIN 経費・返品金額テーブル ON 注文者マスタ.注文番号 = 経費・返品金額テーブル.注文番号) LEFT JOIN 受注明細マスタ ON 注文者マスタ.注文番号 = 受注明細マスタ.注文番号 GROUP BY Format(注文者マスタ!注文日,"yyyy/mm");

  • アクセス

    アクセスで悩んでいます。VBAがまだ分からない初心者です。 受注テーブルに…受注ID(オートナンバー)、納期、注文書番号、品名、仕様、台数(1台~40台口で注文あり) 仕様テーブルに…仕様ID(オートナンバー)、仕様品目 受注テーブルの仕様と仕様テーブルのIDでリレーションしてあります。 出荷の梱包が10台以下なので、10台分割して看板が必要です。 方法がまったく分からないのですが、ユニオンクエリで試した所… SELECT*, "10/" & 台数 As ロット数 FROM 受注テーブル WHERE 台数 >= 台数\10 UNION ALLSELECT *, (台数 Mod 10) & "/" & 台数 FROM 受注テーブル WHERE 台数 Mod 10; 上記の結果が… 受注ID 1…1台 1/1,10/1      2…20台 10/20      3…6台 6/6,10/6      4…16台 6/16,10/16 5…18台 8/18,10/18 6…40台 10/40 7…30台 10/30    となってしまいました。 本当は… 受注ID 1…1台 1      2…20台 10/20,10/20 3…6台 6 4…16台 6/16,10/16 5…18台 8/18,10/18 6…40台 10/40,10/40,10/40,10/40 7…30台 10/30,10/30,10/30     となって欲しです。 方法、式…どうしたらいいですか。

  • この場合のSQL構文を教えてください(MYSQL5.0)

    お世話になります。下記の場合どうしたらできるかどうか教えてください。 ・商品リストテーブル  商品ID(int primary key auto_increment )  商品名(char) ・受注リストテーブル  受注ID(int primary key auto_increment )  商品ID(int)  注文者(char) 上記のように二つのテーブルに分かれています。 (1)新商品の注文が入ると、商品リストテーブルにレコードがINSERTされ 受注リストにも同時にINSERTされるとします。 (2)すでに商品リストテーブルに登録済みの商品名の場合は受注リストテーブルのみINSERTされます。 この場合、商品リストの商品IDは自動インクリメントされるので問題ないですが、受注リストの商品IDはインクリメントされません。 商品リストに新レコードができると、このリストの商品IDは新しい番号がふられますが、この新しくできた番号を受注リストの商品IDに同時にいれたいのです。 ○方法として 二つのテーブルをJOINしてレコードをINSERTできるのならしたいのですが、どうゆうSQL文を書けばいいのかわかりません。 またその方法以外にとりあえず商品リストテーブルにだけINSERTしてそのタイミングで受注リストテーブルにトリガでINSERTとかする方法もありなんでしょうか? できればJOINした方にINSERTする方法でやりたいのですが、無理なら後者のほうでもいいんですが・・・。 SQL文わかる方どうかよろしくお願いいたします。

    • ベストアンサー
    • MySQL