MySQLをJAVAで組むのに詰まっています。
■抽出したいもの
1.来社した人の回数と期間で、よく来社した人を
2.「1.」の人をTableAのcustomer_idでユニークに、
を上位から抽出したい。
下記のような構想SQLを考えたのですが、動くわけもありません。
どのように、SQL文を組めばよろしいでしょうか?
※テーブルは、2つで、
・TableBは、日付と来た人と、来た回数分だけのレコードを保持しています。
・TableAは、人の名前や住所などが入っています。
※TableBには、多数の人のレコードが入っており、
Aさんの場合だと、Aさんが来た数だけレコード数が入っています。
==================================
SQL TableA., TableB.
FROM TableA JOIN TableB ON
(TableA.index == TableB.index)
AND (TableA.name == TableB.name)
AND (TableB.delete_flag == false)
WHERE
(COUNT5回 <= (SELECT COUNT(*) FROM TableB WHERE (TableB.date >= (CURDATE() - 14日))))
※2週間に、5回以上来た人を抽出したい。
AND
(COUNT8回 <= (SELECT COUNT(*) FROM TableB WHERE (TableB.date >= (CURDATE() - 60日))))
※2ヶ月に、8回以上来た人を抽出したい。
AND
(COUNT5回 <= (SELECT COUNT(*) FROM TableB WHERE (TableB.date >= (CURDATE() - 180日)))
※半年に、5回以上来た人を抽出したい。
OBDER BY COUNT DESK;
==================================
テーブル構造
■TableA : お客様情報
primary key
↓
customer_id company_id name tel address ・・・・・
1 1 山田 090-~ 東京都港区
2 1 沢田 03-~ 東京都千代田区
3 1 菊池 03-~ 東京都中央区
4 2 鈴木 03-~ 東京都渋谷区
5 2 小林 03-~ 東京都目黒区
: : : : :
TableAとTableBは、customer_idとcompany_idで紐付けできるが、複数一致。
■TableB : お客様の来社記録
primary key
↓
resertaion_id customer_id company_id date memo ・・・・・
1 1 1 2015-07-01 見積もり
2 1 1 2015-07-07 下見
3 1 1 2013-12-31 名刺交換
4 2 1 2015-07-28 プレゼント
5 2 4 2015-01-01 宝くじキャンペーン
6 2 4 2013-12-31 大晦日祭り
: : : : :
==========================================================
追記:2015/07/28 21:30
=========================================
作ったけど、抽出件数が、常に0件のSQL文。
関数に与える引数 ⇒ iParaCompany_id
String strSQL = // 2週間に5回以上来た人 "SELECT TableA.*, TableB.*" + " FROM TableA" + " JOIN (" + " SELECT" + " COUNT(*) AS CNT" // 来た回数 + ", '2週間に5回以上'" + " FROM TableB" + " WHERE TableB.date > DATE_ADD(CURRENT_DATE() , INTERVAL -2 WEEK)" + " GROUP BY" + " HAVING SUM(count) >= 5" // 2ヶ月に8回以上来た人 + " UNION ALL" + " SELECT" + " COUNT(*) AS CNT" // 来た回数 + ", '2か月に8回以上'" + " FROM TableB" + " WHERE TableB.date > DATE_ADD(CURRENT_DATE() , INTERVAL -2 MONTH)" + " GROUP BY" + " HAVING SUM(count) >= 8" // 半年に5回以上 + " UNION ALL" + " SELECT" + " COUNT(*) AS CNT" // 来た回数 + ", '半年に5回以上'" + " FROM TableB" + " WHERE TableB.date > DATE_ADD(CURRENT_DATE() , INTERVAL -6 MONTH)" + " GROUP BY" + " HAVING SUM(count) >= 5" + ") TableB" + " ON TableB.TableA_id = TableA.TableA_id" + " WHERE" + " (TableB.company_id = " + iParaCompany_id + ")" // 会社ID + " AND (TableB.delete_flag = false)" + " AND (TableA.delete_flag = false)" + " ODER BY" + " CNT DESC";
=========================================
回答5件
あなたの回答
tips
プレビュー