2012-03-17 30 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