我们在做数据统计的时候, 尤其按照特定的日期序列得到数据,每天都要展示没有的展示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!
具体应用场景 如下图:
评论 (0)