如何在SQLite中获取每日总和

时间:2017-09-30 21:57:11

标签: android sqlite android-sqlite

我有一个简单的SQLite数据库,有两列。

Col 1 SimpleDateFormat(“yyyyDDD”)例如2017001(2017年1月1日)

每小时出现2小时

所以每天都有一个独特的代码,每天有24行不同的出现。 如何获取发送到ArrayList(Float)的每一天的出现次数?最终,此ArrayList将填充MPAndroidChart。我用以下代码成功地提取了数据(没有总和)。但是,在我的日期代码的帮助下获得每日金额已经困扰了我好几天。我尝试了GROUP BY和SUM的许多变体,只是每次崩溃。

public ArrayList<Float> getOccChartData(){
    SQLiteDatabase db = this.getWritableDatabase();
    ArrayList<Float> yNewData = new ArrayList<>();
    String query = "SELECT OCC FROM user_table ORDER BY ID DESC LIMIT 96";
    Cursor c = db.rawQuery(query, null);
    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        yNewData.add(c.getFloat(c.getColumnIndex("OCC")));
    }
    c.close();
    return yNewData;
}

1 个答案:

答案 0 :(得分:2)

目前还不清楚你是否想要总和而不是行数,所以假设你只需要总和,那么也许你可以这样做: -

public ArrayList<Float> getOccChartData(){
    SQLiteDatabase db = this.getWritableDatabase();
    ArrayList<Float> yNewData = new ArrayList<>();

    String query = "SELECT SUM(OCC) AS OCC FROM user_table GROUP BY ID ORDER BY ID DESC"

    Cursor c = db.rawQuery(query, null);
    while(c.moveToNext) {
        yNewData.add(c.getFloat(c.getColumnIndex("OCC")));
    }
    c.close();
    return yNewData;
}

实施例

例如,假设您的表有(为简洁起见,每个表不是24行): -

enter image description here

以上结果将导致游标包含以下内容: -

enter image description here

请注意!由ORDER BY DESC引起的逆转(所以最新的数据首先)。 即 2017001 ,15 + 20 + 30 + 40 = 105 最后一行。

yNewData会相应地有3个元素: -

  • yNewData[0] 48
  • yNewData[1] 50
  • yNewData[2] 105

替代考虑因素

如果您想要一段时间,那么您可以将SELECT更改为: -

SELECT SUM(OCC) FROM user_table WHERE ID BETWEEN 2017001 AND 2017002 GROUP BY ID ORDER BY ID DESC

根据所需逻辑生成值2017001和2017002并放入查询字符串。

在这种情况下,返回的结果数据为: -

  • yNewData[0] 50
  • yNewData[1] 105

如果您想要所有中间值以及总和,则事情会更复杂,因为实际上您在单个维度数组中返回两种类型的数据。

以上作为SQL Fiddle

以上为SQL Fiddle