我们在做数据统计的时候, 尤其按照特定的日期序列得到数据,每天都要展示没有的展示0,这个时候如果我们group by日期,很容易就得到我们的数据了。
但是每天都要展示, 没有的用0填充,这可有点不好办,那么有什么办法可以实现这样的需求呢。
方法1: 创建一个日期表,把group by的数据 join 对应的日期,那么就可以实现需求了,nice!
如创建 date表(每天写一条日期数据)

select a.dt,rmb from date d join left( select from_unixtime(ctime,'%Y-%m-%d')dt,sum(Rmb)rmb from Table group by dt)a on d.dt=a.dt;

方法2: 不需要创建date表,直接凭空生成连续的日期~方法参考stackoverflow的大神。

 select Days from (
        SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Days
        FROM       (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
    )aa WHERE aa.Days >= '2021-12-10' - INTERVAL 30 DAY   order by  Days  limit 30

该语句执行后得到从 2021-12-10开始之前的30天内的日期值,需要其他日期自己灵活运用就行了。

同样的 结合方法1:date表的内容 被上述sql替代即可,very nice!

方法3:mysql8+才支持,缩短了方法2的语句

 with recursive all_dates(dt) as ( 
    select '2021-12-1' dt
        union all  
    select dt + interval 1 day from all_dates where dt + interval 1 day <= '2021-12-15'
)
select * from all_dates

very very nice!
具体应用场景 如下图:
2021-12-16_10-28.png