说明:同比:同去年的今天进行比较 环比:同上个月的今天进行比较 环比计算 一、先看一下数据,这里只能进行7.10号和6.10号进行对比,比到12号
这里是引用±------------------------±-----------------------±-----------------------------±-------------------------+ | bas_cgj_ssrlsj1.spotid | bas_cgj_ssrlsj1.times | bas_cgj_ssrlsj1.totalnumber | bas_cgj_ssrlsj1.date_id | ±------------------------±-----------------------±-----------------------------±-------------------------+ | TIANZIFANG | 2020-06-10 | 14875 | 20200904 | | TIANZIFANG | 2020-06-11 | 12447 | 20200904 | | TIANZIFANG | 2020-06-12 | 12447 | 20200904 | | TIANZIFANG | 2020-06-13 | 1582 | 20200904 | | TIANZIFANG | 2020-06-14 | 1582 | 20200904 | | TIANZIFANG | 2020-07-08 | 21422 | 20200904 | | TIANZIFANG | 2020-07-09 | 21822 | 20200904 | | TIANZIFANG | 2020-07-10 | 23046 | 20200904 | | TIANZIFANG | 2020-07-11 | 29545 | 20200904 | | TIANZIFANG | 2020-07-12 | 28982 | 20200904 | ±------------------------±-----------------------±-----------------------------±-------------------------+
二、先介绍一下环比同比计算的add_months函数 (并解决一下月份不同天的对比法) select add_months(‘2020-09-04’,-1); 得到 2020-08-04 -1 代表减去一个月 +1 代表加一个月 (这个函数有个坑,先留着往下看代码)
select d.spotid,d.times,d.totalnumber,d.last_month_day,d.last_month_day_num, concat(nvl(round((d.totalnumber - d.last_month_day_num) / d.last_month_day_num * 100,2),0),'%') as ratio from ( select a.spotid,a.times,a.totalnumber, if(b.times is null,0,b.times) as last_month_day, if(b.totalnumber is null,0,b.totalnumber) as last_month_day_num from (select spotid,times,totalnumber from bas_cgj_ssrlsj1 where date_id = '20200904') a left join (select spotid,times,totalnumber from bas_cgj_ssrlsj1 where date_id = '20200904') b on a.spotid = b.spotid and day(b.times) = day(a.times) and month(b.times) = month(add_months(a.times,-1)) and year(b.times) = year(add_months(a.times,-1)))d;步骤解析: 1.
(select spotid,times,totalnumber from bas_cgj_ssrlsj1 where date_id = '20200904') a left join (select spotid,times,totalnumber from bas_cgj_ssrlsj1 where date_id = '20200904') b on a.spotid = b.spotid这部分是以左表a 作为主表:为本月数据,b为上个月的数据 (这样关联是因为要将本月数据作为主表数据进行关联对比,假如本月3月有31天,而2月只有28或29天,本月多出的两天需要做展现,而上月少的两天可以被填充)
select a.spotid,a.times,a.totalnumber, if(b.times is null,0,b.times) as last_month_day, if(b.totalnumber is null,0,b.totalnumber) as last_month_day_num from (select spotid,times,totalnumber from bas_cgj_ssrlsj1 where date_id = '20200904') a left join (select spotid,times,totalnumber from bas_cgj_ssrlsj1 where date_id = '20200904') b on a.spotid = b.spotid and day(b.times) = day(a.times) and month(b.times) = month(add_months(a.times,-1)) and year(b.times) = year(add_months(a.times,-1))关联之后 加了三个and条件 这是最为核心的部分, 为什么要加3个and条件? 前面提到了这个函数有个坑 一起来看看: select add_months(‘2020-03-31’,-1); 结果是 2020-02-29 因为本月3月的 30号 31号 和上个月的对不上,所以本月数据作为主表,上月数据作为关联字段 ,展现本月数据 ,上月数据关联不上 填充为 null 或者 0 都可以
所以:关联条件为 day = day month = month year = year 再用left 连接 关联不上的就被null填充 保证数据关联的准确性
我这里用的if 条件用0填充了,最后再把这些数据作为子表进行环比计算 结果为: 同比 就不多介绍啦,和环比一样的,就需要把add_months -1 改为 减 12个月就ok啦
希望对你有帮助~~
