选择with union all语句抛出异常:没有这样的列:借用

时间:2016-12-10 14:03:16

标签: android sqlite join android-sqlite union

按日期我有一个存有金钱项目的表格 有些货币项目是贷款,其他货币则是借入。

我想要做的是,放入ListView 3元素:日期,此日期的贷款金额总和,此日期借入金额的总和。

以下是填写光标的代码:

Cursor cursor = mDb.rawQuery("SELECT date_o, loan, borrow FROM " +
                        "(SELECT strftime('%m', date) as date_o, SUM(amount) as loan FROM " +
                        "(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_LOAN_TYPE + " ORDER BY date DESC) " +
                        "GROUP BY strftime('%m', date) " +
                        "UNION ALL " +
                        "SELECT strftime('%m', date) as date_o, SUM(amount) as borrow FROM " +
                        "(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_BORROW_TYPE + " ORDER BY date DESC) " +
                        "GROUP BY strftime('%m', date)) GROUP BY date_o", null);

这是填充我的ListView的代码:

List<List<Float>> amountByMonth = new ArrayList<>();
        List<Float> data = new ArrayList<>();

        if (cursor.moveToFirst()) {
            do {
                data.add(Float.parseFloat(cursor.getString(0)));
                data.add(Float.parseFloat(cursor.getString(1)));
                data.add(Float.parseFloat(cursor.getString(2)));
                amountByMonth.add(data);
            }
            while (cursor.moveToNext());
        }

所以我的函数返回List<List<Float>>

我得到的问题是:

Couldn't read row 0, col 2 from CursorWindow

所以我的调查显示cursor.getString(2)不存在(抛出异常),我认为我的查询构造错误。

表格详情如下:

private static final String TABLE_MONEY = "money",
            KEY_MONEY_ID = "id",
            KEY_MONEY_TITLE = "title",
            KEY_MONEY_AMOUNT = "amount",
            KEY_MONEY_DETAILS = "details",
            KEY_MONEY_DATE = "date",
            KEY_MONEY_TYPE_FK_ID = "type",
            KEY_MONEY_CONTACT_FK_ID = "contact",
            KEY_MONEY_REMINDER_FK_ID = "reminder";

如果您需要进一步的详细信息,请不要犹豫。

编辑:我在//中进行测试后修改了我的查询。 我在这里得到的问题是列借用是未知的。

1 个答案:

答案 0 :(得分:1)

目前,您只选择 2 时会假装阅读 3 列:SELECT strftime('%m', date) as date_o, SUM(amount) as loan ...

使用UNION子句时,所有子查询中必须包含相同列loanborrow不相同列)。
您可以在各自的子查询中使用0 AS borrow0 AS loan作为第3列的假列占位符。

即:

Cursor cursor = mDb.rawQuery("SELECT date_o, loan, borrow FROM " +
    "(SELECT strftime('%m', date) as date_o, SUM(amount) as loan, 0 AS borrow FROM " +
    "(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_LOAN_TYPE + " ORDER BY date DESC) " +
    "GROUP BY strftime('%m', date) " +
    "UNION ALL " +
    "SELECT strftime('%m', date) as date_o, 0 AS loan, SUM(amount) as borrow FROM " +
    "(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_BORROW_TYPE + " ORDER BY date DESC) " +
    "GROUP BY strftime('%m', date)) GROUP BY date_o", null);