2012-03-17 33 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,並按pdate將它們分組,其中pvalue2 = XX。我的問題是,我不能把這個條件放入查詢中(因爲它的工作,像「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()); 
    } 
} 

這是好到目前爲止,這樣我就可以用這個日誌DATAS其中pvalue2 = XX和NotXX和得到的東西是這樣的: (PDATE,pvalue1,pvalue2)20120317,48,29; --- ---; 20120317,21,54; ------- 20120317,11,XX; ----- 20120318,79,71; ------- 20120318,21,XX;

我想做什麼?

第一:按pdate對總和(pvalue1)進行分組,並指出它是否爲pvalue2爲XX或不是XX,所以這樣的事情: 20120317,NotXX,69(自48 + 21 = 69)------- - 20120317,XX,11 -------- 20120318,NotXX,79 -------- 20120318,XX,21

在此之後,我想減去NOTXX總和中的XX總和每天。我想得到: 20120317,58(自69-11)------- 20120318,58(自79-21)

我該怎麼做? 非常感謝您提前!

回答

1

我的問題是,我不能把這個條件到查詢

你可能錯了。您可以添加類似(語法可能有錯誤)

「SELECT SUM(選擇DATABASE_TABLE PDATE其中PDATA> x和PDATE < Y)的總和」

的投影參數,你會得到結果作爲列名爲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值。 – 2012-03-17 17:39:27

+0

是的,如果您在'selectionArgs'中指定'selection'參數中的'?',但我的意思是將'?'放入'projection'中。它可能工作,但我相信它沒有。將需要[準備語句](http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#compileStatement%28java.lang.String%29)probaly – zapl 2012-03-17 18:10:01

+0

'db.query(「table」,新的String [] {「_id」,「sum(從表where pdate>?選擇pdate作爲總和)」},「pdate> =?AND pdate <=?」,new String [] {/ * projection? */datefrom,dateto},null,null,null);'這就是我的意思 – zapl 2012-03-17 18:15:45