一,概念
环比就是这个月比上个月,单位不一定是月,可以是任何时间单位。
环比计算方式:环比增长速度 =(本期数-上期数)÷ 上期数×100%
二,数据准备
我们有两张表
一张表有book_id(书id) sale(销售数量) time(销售时间)
另一张 book_id(书id) price(单价)
三,计算环比
3.1
首先将两张表进行关联,算出每一月份的交易总额,在日期中取出月份
select book.book_id,month(sale_time) month,sum(sale * num)money
from book join book_price bp on book.book_id = bp.book_id
group by book.book_id,sale_time
3.2
使用lag()over()取出上一月份的总额添加新字段,
with tb1 as (
select book.book_id,month(sale_time) month,sum(sale * num)money
from book join book_price bp on book.book_id = bp.book_id
group by book.book_id,sale_time)
# tb2 as(
select book_id,month ,money 本期,
lag(money,1) over (order by month )上一期
# lag(需要取的字段,行数)over(按照月份升序进行排序)
from tb1 group by book_id, month, money;
3.3
接上一步结果,就可以使用环比公式 环比增长速度 =(本期数-上期数)÷ 上期数×100% 截取字段进行计算,if()对数据进行判断,如果是空的,显示上期没有数据结果,不让他显示null
with tb1 as (
select book.book_id,month(sale_time) month,sum(sale * num)money
from book join book_price bp on book.book_id = bp.book_id
group by book.book_id,sale_time),
tb2 as(
select book_id,month ,money 本期,
lag(money,1) over (order by month )上一期
from tb1 group by book_id, month, money)
select month,本期,if(上一期 is null ,'上一期没有数据',上一期)上一期,
if(round((本期-上一期)/上一期 * 100,3) is null ,'上一期没有数据',round((本期-上一期)/上一期 * 100,3)) as 环比
from tb2;