1

任何人都可以帮助我以下查询在 DB Browser 中运行良好,但不适用于Room数据库。这是表格和查询:

Transaction

ID 数量 is_credit

询问:

SELECT * 
FROM 
    (SELECT 
         id, amount, 
         SUM(CASE WHEN is_credit = 1 THEN amount ELSE -amount END) OVER (ORDER BY id) AS balance 
     FROM `Transaction`) 
ORDER BY 
    id DESC;

我已经尝试过此查询,SimpleSQLiteQuery但出现错误:

E/SQLiteLog: (1) "(" 附近: 语法错误

4

2 回答 2

0

您正在尝试使用 SQLite Windows 函数,即Android 设备上的SQLite版本通常落后一些。对于 SQLite 版本 3.28.0(引入 Windows 函数时),您至少需要 API 30 (Android R)。显然,这会限制应用程序的安装基础。

您可能希望查看Android 中使用的 SQLite 版本?

于 2021-05-08T07:11:43.703 回答
0

如果您的 SQLite 版本低于3.25.0,那么您不能使用SUM().

相反,您可以使用相关的子查询来做到这一点:

SELECT t.id, 
       t.amount,
       (SELECT SUM(CASE WHEN tt.is_credit = 1 THEN 1 ELSE -1 END * tt.amount) FROM `Transaction` tt WHERE tt.id <= t.id) AS balance 
FROM `Transaction` t
ORDER BY t.id DESC;

或自加入:

SELECT t.id, 
       t.amount,
       SUM(CASE WHEN tt.is_credit = 1 THEN 1 ELSE -1 END * tt.amount) AS balance 
FROM `Transaction` t INNER JOIN `Transaction` tt
ON tt.id <= t.id
GROUP BY t.id
ORDER BY t.id DESC;

查看简化的演示

于 2021-05-08T09:45:19.067 回答