2012-03-17 13 views
1

私は、id、pdate、pvalue1、pvalue2という列のデータベースを持っています。まず、私はカーソルでの問合せを行います。Sqliteでこのクエリをどのように行うべきですか?

Cursor c = ourDatabase.query(DATABASE_TABLE, new String[] { "_id","pdate","pvalue1","pvalue2"}, 
        "pdate >= ? AND pdate <= ?", new String[] { datefrom, dateto }, null, null, null); 

これは、例えば、私にいくつかの行を与える場合pdate = 20120318、その後、pvalue1 = 58、pvalue2 = 29。これらは文字列なので、pvalue2に "XX"の値を与えることができます。私は指定されたdatefromとdatetoの間のpvalue1を合計し、pvalue2 = XXの場合はpdateでグループ化したいと思います。私の問題は、私は他のデータも必要としているので、私はこの条件をクエリーに入れることができないということです( "pvalue2 = XX"のように働いています)。

if (c.moveToFirst()) 
{ 
    do{ 
     if (c.getString(3).equals("XX")){ 
     Log.i("XX", c.getString(1) + " " + c.getString(2)) + " " + c.getString(3)); 

      } 
     else { 
     Log.i("NotXX", c.getString(1) + " " + c.getString(2)) + " " + c.getString(3)); 

      } 

    while (c.moveToNext()); 
    } 
} 

それは今のところ大丈夫ですので、私はこの場所pvalue2 = XXで件のデータを記録し、NotXXと、このような何かを得ることができます。20120317,48,29 (pdate、pvalue1、pvalue2を); --- ---; 20120317,21,54; ------- 20120317,11、XX; ----- 20120318,79,71; ------- 20120318,21、XX;

私は何をしたいですか?

最初に、pdateによって合計(pvalue1)をグループ化し、pvalue2がXXまたはnotXXの場合はそれを示します。したがって、 20120317、NotXX、69(48 + 21 = 69以降) - 20120317、XX、11 -------- 20120318、NotXX、79 -------- 20120318、XX、21

これ以降、NotXX合計からXX合計を差し引いて毎日。取得したい: 20120317,58(since 69-11)------- 20120318,58(since 79-21)

どうすればよいですか? ありがとうございます!

答えて

1

私の問題は、私はあなたがおそらく間違っているクエリ

にこの条件を置くことができないということです。あなたは(構文エラーを含んでいてもよい)

投影引数に

「の和(DATABASE_TABLEどこPDATA> xとpdate < Yからpdateを選択)の和としての選択」とあなたがように、その結​​果を得るようなものを追加することができますsumという名前の列。唯一の問題は、投影に?のサポートがないということです(少なくとも試してみませんでしたが、うまくいかないと思います)

これはあなたが望むものではない場合、非常に異なる方法です。 SQLiteは非常に強力です。

編集:

これはまあまあですか?これはSQLではなく、毎日のために必要な合計を出力します。

Cursor c = ourDatabase.query(DATABASE_TABLE, new String[] { "_id","pdate","pvalue1","pvalue2"}, 
     "pdate >= ? AND pdate <= ?", new String[] { datefrom, dateto }, null, null, "pdate"); 
boolean first = true; 
if (c != null) { 
    String currentDate = null; 
    int sum = 0; 
    while (c.moveToNext()) { 
     String date = c.getString(1); 
     int value1 = c.getInt(2); 
     String value2 = c.getString(3); 
     if (!date.equals(currentDate)) { 
      if (!first) { 
       Log.d("TAG", "The result for " + currentDate + " is: " + sum); 
      } else { 
       Log.d("TAG", "Date has changed, but we don't have data yet."); 
      } 
      first = false; 
      currentDate = date; 
      sum = 0; 
     } 
     if ("XX".equals(value2)) { 
      Log.d("TAG", "new line: " + date + ", " + value1 + ", " + value2 + " -"); 
      sum -= value1; 
     } else { 
      Log.d("TAG", "new line: " + date + ", " + value1 + ", " + value2 + " +"); 
      sum += value1; 
     } 
    } 
    if (!first) { 
     Log.d("TAG", "The last result: " + currentDate + " is: " + sum); 
    } 
    c.close(); 
} 

EDIT2:あなたはそれがデータベースによって行わたいときは、うまくいくかもしれません。

Cursor c = ourDatabase.rawQuery(
     "SELECT pdate, sum(sum2) AS sum1 FROM " + 
     "(" + 
     " SELECT pdate, pvalue1, pvalue2, -sum(pvalue1) AS sum2 " + 
     "  FROM " + DATABASE_TABLE + 
     "  WHERE pvalue2='XX' GROUP BY pdate" + 
     " UNION " + 
     " SELECT pdate, pvalue1, pvalue2, sum(pvalue1) AS sum2 " + 
     "  FROM " + DATABASE_TABLE + 
     "  WHERE pvalue2!='XX' GROUP BY pdate" + 
     ") " + 
     " WHERE pdate>=? AND pdate<=? " + 
     " GROUP BY pdate", 
     new String[] { datefrom, dateto }); 
if (c != null) { 
    while (c.moveToNext()) { 
     String date = c.getString(0); 
     int value1 = c.getInt(1); 
     Log.d("TAG", "The result for " + date + " is: " + value1); 
    } 
    c.close(); 
} 
+0

他にも多くのクエリが含まれていますか?私のプロジェクトではそれは問題ではありません。たとえば、私は使用することができます:new String [] {"_id"、 "pdate"、 "sum(pvalue1)"、}、 \t \t \t \t \t "pdate> =?AND pdate <=?"、new String [] {datefrom、dateto}、 "pdate"、null、null);これは毎日pvalue1の合計を私に与えます。しかし、XXとNotxxの値を分けなければならないので、私はこれを使用できません。 –

+0

はい、 'selection'引数の'? 'は' selectionArgs'でそれらを指定すると機能しますが、 '?'を 'projection'に入れることを意味します。それは動作するかもしれませんが、私はそれがないと信じています。必要とする[prepared statement](http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#compileStatement%28java.lang.String%29)probaly – zapl

+0

'db.query(" table "、新しいString [] {"_id"、 "sum(テーブルからどこからpdate>?)を集計として選択する"}、 "pdate> =?AND pdate <=?"、new String [] { */datefrom、dateto}、null、null、null);それは私が意味することです – zapl

関連する問題