SQLite查询最近7天每日交易总额 无数据时返回0/null的实现
核心问题在于你现有SQL是直接对交易表做分组聚合,没有交易记录的日期本身不存在于交易表中,自然会被过滤。要实现需求你需要先生成最近7个自然日的连续日期序列,再和交易表关联聚合即可,以下是适配你当前使用的SQLite语法的实现:
WITH RECURSIVE recent_days AS ( -- 递归生成最近7天的连续日期序列,从当日开始往前推 SELECT DATE('now') AS full_date UNION ALL SELECT DATE(full_date, '-1 day') FROM recent_days LIMIT 7 ) SELECT IFNULL(SUM(t.value), 0) AS total, STRFTIME('%d/%m', rd.full_date) AS date FROM recent_days rd LEFT JOIN transactions t ON DATE(t.date, 'unixepoch') = rd.full_date GROUP BY rd.full_date ORDER BY rd.full_date DESC;
关键说明
- 递归CTE
recent_days会生成固定7条的连续日期记录,不受交易表数据影响 - 用
LEFT JOIN关联交易表,保证无交易的日期不会被过滤 IFNULL(SUM(t.value), 0)会将无交易日期的总额默认置为0,如果你需要返回null直接去掉IFNULL包裹即可- 日期输出格式默认按你示例的
日/月格式实现,如果你不需要前导零(比如22/9而非22/09),可以在SQLite 3.38.0及以上版本使用STRFTIME('%_d/%_m', rd.full_date)调整格式化参数 - 输出默认按日期倒序排列,最新的日期在最上方,和你给出的示例排序一致
内容的提问来源于stack exchange,提问作者hesham shawky
相关产品推荐
相关产品推荐

