0

我试图从我的 SQLite 数据库中获取平均最后 5 个(非空)条目。但不知何故,我没有得到预期的答案。

这是查询

    db.execSQL( "CREATE TABLE "+FUEL_DATABASE_TABLE +" (" +
                            KEY_ROW_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                            KEY_KM + " LONG NOT NULL, "+
                            KEY_FUEL_QTY + " INTEGER NOT NULL, "+
                            KEY_FUEL_PRICE + " DOUBLE NOT NULL, "+
                            KEY_TOTAL_COST + " DOUBLE NOT NULL, "+
                            KEY_MILEAGE + " DOUBLE NOT NULL, "+
                            KEY_DATE + " DATE NOT NULL, "+
                            KEY_TANK_FULL + " TEXT);"
                            );

    public long createEntry(FuelExpense fe) 
        {
            // TODO Auto-generated method stub


            ContentValues cv = new ContentValues();
            cv.put(KEY_KM, fe.getKm());
            cv.put(KEY_FUEL_QTY, fe.getFuelQty());
            cv.put(KEY_FUEL_PRICE,fe.getFuelPrice());
            cv.put(KEY_TOTAL_COST, fe.getTotalCost());
            cv.put(KEY_MILEAGE, fe.getMileage());
            cv.put(KEY_DATE, fe.getFuelFilledDate());
            cv.put(KEY_TANK_FULL, fe.getTankFullstatus());
            return ourDatabase.insert(FUEL_DATABASE_TABLE, null, cv);
        }





        public String getData()
        {
            // TODO Auto-generated method stub
            String [] columns = new String[]{KEY_ROW_ID, KEY_KM, KEY_FUEL_QTY, KEY_FUEL_PRICE, KEY_TOTAL_COST, KEY_MILEAGE, KEY_DATE,KEY_TANK_FULL};
            fuelCursor =  ourDatabase.query(FUEL_DATABASE_TABLE, columns, null, null, null, null, null);
            String resultSQL= "";

            while(fuelCursor.moveToNext())
            {
                resultSQL = resultSQL + fuelCursor.getString(0) + "         " + fuelCursor.getString(1) + "         " + fuelCursor.getString(2) +"           "+ fuelCursor.getString(3) + "          " + fuelCursor.getString(4) + "          " + fuelCursor.getString(5) + "         " + fuelCursor.getString(6) + "        " + fuelCursor.getString(7) + "\n ";  
            }
            return resultSQL;
        }
 public void getAvgMileage(Prediction pd) 
    {
            predictionCursor = ourDatabase.rawQuery("SELECT ROUND(AVG(_mileage)) FROM fuel_table WHERE _mileage IS NOT NULL ORDER BY _id DESC LIMIT 5", null);
                        if(predictionCursor!=null && predictionCursor.getCount()>0)
                        {
                                predictionCursor.moveToLast();
                                findAvgMileage = predictionCursor.getDouble(0);
                                pd.setpredictionMileage(findAvgMileage);

                        }

    The value obtained from predictionCursor needs to be used for further calculations like so,

            if(ETPredictFuelQty.hasFocus())
                        {
                            if(predictKm!=0)
                            {
                                predictFuetlQty =predictKm/predictionMileage;
                                ETPredictFuelQty.setText(new DecimalFormat("##.##").format(predictFuetlQty));
                            }

                        }

_mileage 的值为 10,10,5,3.33,7.5,其平均值应为 predictAvgMileage=7.166

我输入 predictKm =1000 的值

所以 predictFuelQty = predictKm/predictAvgMileage = 139.54(预期答案)

但我得到 predictFuelQty = 166.67

任何人都可以帮我找出问题所在。还有这里的SQL日志

SELECT name, sql FROM sqlite_master WHERE type='table' ;
PRAGMA TABLE_INFO(android_metadata);
PRAGMA TABLE_INFO(sqlite_sequence);
PRAGMA TABLE_INFO(fuel_table);
SELECT name, sql FROM sqlite_master WHERE type='index' 
SELECT rowid, *  FROM android_metadata ORDER BY rowid; 
SELECT name, sql FROM sqlite_master WHERE type='table' ;
PRAGMA TABLE_INFO(android_metadata);
PRAGMA TABLE_INFO(sqlite_sequence);
PRAGMA TABLE_INFO(fuel_table);
SELECT name, sql FROM sqlite_master WHERE type='index' 
SELECT rowid, *  FROM android_metadata ORDER BY rowid; 
SELECT rowid, *  FROM fuel_table ORDER BY rowid; 
4

3 回答 3

1

我想从你那里得到更多的意见。它会告诉你这里出了什么问题,如果不是我可以解决你的问题。

1)在问题中添加您的表架构。(很可能这是您的问题)

2)就在您尝试从数据库中获取平均值之前,尝试获取并打印数据库中所有可用的值。打印它们,在问题中添加日志。

3) 打印您从 DB 获得的 AVG 值。

findAvgMileage = predictionCursor.getDouble(0); // print findAvgMileage in the logs

完成后添加评论,以便通知我。

PS:- 这不是完整的答案,由于长度我无法将其添加为评论。将在 OP 更新问题后立即更新答案并提供更多输入

于 2013-07-21T06:08:48.143 回答
1

您的问题是该LIMIT子句适用于查询结果,该结果已经是一条记录。换句话说,查询NULL首先计算所有非记录的平均值,然后确保AVG函数返回的值不超过五个。

尝试使用子查询:

SELECT AVG(_mileage)
FROM (SELECT _mileage
      FROM fuel_table
      WHERE _mileage IS NOT NULL
      ORDER BY _id DESC
      LIMIT 5)
于 2013-07-21T10:19:37.537 回答
1

我不认为你得到 166.67,我认为你实际上得到 142.85(142.86,我不确定 Java 如何DecimalFormat处理舍入和截断)。

为什么我会这样想?好吧,你的 SQL 是这样说的:

SELECT ROUND(AVG(_mileage)) ...

所以平均值是 7.166,当你四舍五入时,它变成了 7.0。然后1000/7.0给你142.8571...

无论如何,我认为您只想ROUND()从 SQL 中删除该调用。如果你真的得到 166.67,那么你会想要检查你的数据是否真的是你认为的在 ORDER 和 LIMIT 之后的样子,或者在你的计算中寻找其他地方的错误。

于 2013-07-21T06:07:38.923 回答