SQLite 按选定日期范围内的所有日期分组,即使数据不存在

Posted

技术标签:

【中文标题】SQLite 按选定日期范围内的所有日期分组,即使数据不存在【英文标题】:SQLite group by all the days in selected date range even data not exsist 【发布时间】:2021-03-22 19:32:09 【问题描述】:

我有一个表 invoice 有两列,datetotal 我想得到过去 30 天的 total 组按一个月的所有天(或者最后 7 天按一周中的所有日子)

date     total
11/16    500
11/23    200
12/2     400
12/4     600

我尝试过这样的事情,

SELECT strftime('%m/%d', Date) as valDay, SUM(Total) 
FROM invoice  
GROUP BY valDay 
Order By Date DESC LIMIT 30 ;

它提供最后 30 条记录。但我想要所有过去 30 天的记录,即使表在某些天没有数据(它必须返回 0 作为那几天的总和)

【问题讨论】:

【参考方案1】:

您可以使用递归查询来生成日期,然后使用左连接将表带入并聚合:

with recursive cte as (
    select date('now') as dt,  date('now', '-30 day') last_dt
    union all select date(dt, '-1 day'), last_dt from cte where dt > last_dt
)
select c.dt, coalesce(sum(i.total), 0) as total
from cte c
left join invoice i on i.date >= c.dt and i.date < date(c.dt, '+1 day')
group by c.dt
order by c.dt desc

【讨论】:

以上是关于SQLite 按选定日期范围内的所有日期分组,即使数据不存在的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite,使用分组?对于具有日期范围的子查询

选择日期范围,根据关闭条件计算范围内的多条记录,按班次分组

在mysql和php中按日期范围分组

在 CTE 中对日期范围内的列求和?

SQL - 显示给定范围内的所有日期,并使用数据库中的时间戳计算该日期有多少帖子

SQLite 查询相关范围内的日期