Room查询问题:如何按类型分组获取费用总和及对应类型名称
解决Room查询中同时获取类型名称与对应总和的问题
没问题,你完全不需要为每个类型单独编写查询,单条SQL语句就能同时拿到类型名称和对应的支出总和,而且适配图表展示的需求很容易。下面是具体的实现步骤:
1. 创建投影类接收查询结果
因为你的Expense实体类包含的字段比你需要的多,而且查询结果是type和SUM(value)两个字段的组合,所以我们需要创建一个简单的数据类来映射这个结果:
public class ExpenseTypeTotal { private final String type; private final Double total; // 注意:构造函数的参数名需要和查询返回的列名对应,或者用@ColumnInfo注解指定 public ExpenseTypeTotal(String type, Double total) { this.type = type; this.total = total; } // Room需要getter方法来访问这些字段 public String getType() { return type; } public Double getTotal() { return total; } }
2. 修改Dao中的查询语句
更新你的Dao方法,让它返回ExpenseTypeTotal的列表,同时查询type字段和总和:
@Query("SELECT type, SUM(value) AS total FROM expense_table GROUP BY type") LiveData<List<ExpenseTypeTotal>> getTypeWithTotals();
这个查询会返回所有存在支出记录的类型,以及它们的总和,完全满足你最初的需求——比如类型为Bills的所有支出总和会和Bills这个名称一起返回,直接就能用于图表展示。
3. 进阶:包含所有预定义类型(即使无支出)
如果你的图表需要展示所有15个预定义类型(哪怕某个类型没有任何支出,总和显示为0),上面的查询会漏掉那些没有记录的类型。这时候可以用UNION ALL生成一个包含所有预定义类型的临时表,再通过LEFT JOIN关联支出表,最后用COALESCE把NULL值替换为0:
@Query(""" SELECT t.type, COALESCE(SUM(e.value), 0) AS total FROM ( SELECT 'Bills' AS type UNION ALL SELECT 'Car' UNION ALL SELECT 'Child' UNION ALL SELECT 'Clothes' UNION ALL SELECT 'Entertainment' UNION ALL SELECT 'Education' UNION ALL SELECT 'Electronics' UNION ALL SELECT 'Food' UNION ALL SELECT 'Health' UNION ALL SELECT 'Home' UNION ALL SELECT 'Pet' UNION ALL SELECT 'Shopping' UNION ALL SELECT 'Transport' UNION ALL SELECT 'Travel' UNION ALL SELECT 'Others' ) t LEFT JOIN expense_table e ON t.type = e.type GROUP BY t.type """) LiveData<List<ExpenseTypeTotal>> getAllTypeWithTotals();
这样不管某个类型有没有支出,都会出现在结果里,对应的总和为0,完美适配图表展示的完整性需求。
内容的提问来源于stack exchange,提问作者beginner992
相关产品推荐
相关产品推荐

