2011-12-23 3 views
2

私は、このユーザーテーブルを持っている:この統計クエリを動的にするにはどうすればよいですか?

id(int) | created (datetime) 

私は、次のないサーバの統計を表示しています: - あなたは日付 を選択 - あなたが毎日表示したい場合は、(参照、毎週または毎月の統計を選択クエリ)

私はちょうどこのようにそれをすることによって、クエリは非常に静的行った:

WEEK(DATE_ADD(" + date + ", INTERVAL -2 WEEK) // Shows how many users that has been created from two weeks before current date to current date 

は、今私は統計を見てみなければならない管理者がどこまでBAを選択することができるようにしたいです彼は統計を表示したいと考えています。 私はクエリを動的にする必要があります。

String sQuery = "SELECT " + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created) as totalNumberOfCreatedUsers, " + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(" + date + ") = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysNumberOfCreatedUsers, " + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -1 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusOneNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -2 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusTwoNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -3 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusThreeNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -4 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusFourNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -5 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusFiveNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -6 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusSixNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -7 DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusSevenNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE WEEK(" + date + ") = WEEK(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisWeeksNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE WEEK(DATE_ADD(" + date + ", INTERVAL -1 WEEK)) = WEEK(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisWeeksMinusOneNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE WEEK(DATE_ADD(" + date + ", INTERVAL -2 WEEK)) = WEEK(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisWeeksMinusTwoNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE WEEK(DATE_ADD(" + date + ", INTERVAL -3 WEEK)) = WEEK(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisWeeksMinusThreeNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE WEEK(DATE_ADD(" + date + ", INTERVAL -4 WEEK)) = WEEK(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisWeeksMinusFourNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(" + date + ") = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -1 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusOneNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -2 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusTwoNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -3 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusThreeNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -4 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusFourNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -5 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusFiveNumberOfCreatedUsers," + 
       "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE MONTH(DATE_ADD(" + date + ", INTERVAL -6 MONTH)) = MONTH(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisMonthsMinusSixNumberOfCreatedUsers" + 
       ""; 

は、例えば:私は行うことができ 一つの解決方法(Javaの):ここで

は私が作ったオリジナルの静的なクエリである(しかし、これは大規模なクエリを作成し、そして私は、より効率的にしたいですそれを行う方法)(ところで、この例では、私はあなたと解決策は何ができるかのアイデアを与えることを考えるだけで何か)


を、コードを動作していない管理者は、20日/週/月を参照することを選択しました

String addToQuery = ""; 
int daysWeeksMonthsToLookBack = inputFromUser // inputFromUser = 20 in this example 
for(int i=0; i<daysWeeksMonthsToLookBack; i++){ 
    addToQuery += "  (SELECT count(statistic_customer_created.id) FROM statistic_customer_created WHERE DAYOFYEAR(DATE_ADD(" + date + ", INTERVAL -" + i + " DAY)) = DAYOFYEAR(statistic_customer_created.created) AND YEAR(" + date + ") = YEAR(statistic_customer_created.created)) as thisDaysMinusFiveNumberOfCreatedUsers," + 

} 

どのように私はこれをより効率的に行うことができますか? おかげで、事前

+0

日単位でグループ化し、物事のJava側で単日を追加することはできませんか? –

+0

これがどのようにクエリを動的にするのに役立つのか、私は実際にはわかりません。あなたは私がjava側からforループを使用し、クエリで日ごとにグループ化することを提案していますか? – Ikky

答えて

1

に私はあなたが1および2日前の間に作成されたすべてのそれらを得ることができますこれらの日付の差をとることにより

SELECT count(s.id) 
FROM statistic_customer_created s 
WHERE s.created >= {date calculated in Java} 

などの範囲を使用しているだろう。

過去7日間に作成されたものと先週作成されたものの数は同じでなければなりません。

+0

hmmmしかし、私はdate - 1、date - 2などから統計情報を取得する必要があるので、まだ大きなクエリになります。たとえ私がJavaの日付を計算しても.... – Ikky

+0

あなたは一度にすべてを行う場合は、その大きな。私はループで上記のクエリを行うだろうが、それは遅くなる可能性があります。ループ内でStringBuilderにクエリを構築することができます。 –

+1

うん、それも私の考えだった、私はちょうど他の誰かがより良いヒントを持っているかどうか、SQLで動的にそれを行う方法を見たいと思った – Ikky

関連する問題