主要思路 :
  1. 分别查询出上月的数据为一张表, 本月的数据为一张表
  2. 使用 left join 连接两张表, 并使用 where 语句酾浚符合条件的数据行
  3. 使用 case when 语句计算这张联合表相应列的比值, 即为同比环比数据

实际语句示例:

# 计算同比
select s1.id,currDate,currSum currSumFee,prevDate,prevSum prevSumFee,
CASE WHEN prevSum>0 THEN (currSum-prevSum)/prevSum
     ELSE "同期没有数据" END 费用同比  
from 
(select id ,statistic_date currDate,sum(totalFee) currSum 
from billing_statistics where  date_format(statistic_date,'%Y-%m') = '2020-11'  group by id ) s1 
left join
(select id ,statistic_date prevDate,sum(totalFee) prevSum 
from billing_statistics where  date_format(statistic_date,'%Y-%m') = '2019-11'  group by id ) s2
on  s1.id=s2.id group by s1.id

说明:

  1. 其中 currSum 为本期数据, prevSum为上期数据
  2. FORMAT((currSum-prevSum)/prevSum*100,2) 为保留小数点后两位有效数字
  3. CONCAT(FORMAT((currSum-prevSum)/prevSum*100,2),’%’) 为拼接函数
  4. 如果使用 FORMAT或 CONCAT函数, 该列数据类型自动被转为 varchar 类型, 如果需要按照 double类型大小排序, 建议不使用以上两个函数, 同时将 case when 语句中 的 ELSE “同期没有数据” 改为 ELSE 0

参考:

sql语句下的同比,环比操作

MySQL 计算环比(同比类似)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐