文章目录

  • 前言
  • 一、什么是同环比
    • 同比
    • 环比
    • 对比
  • 二、同环比计算SQL
    • 1.数据准备
    • 2.年环比和年同比
    • 3.月环比和月同比
    • 4.周环比和周同比
    • 5.日环比和日同比
  • 总结

前言

同环比是数据分析中的一个重要指标,主要反应指标随时间变化的情况,在日常开发中会经常遇到。今天主要记录下Mysql下如何计算同环比。


一、什么是同环比

同环比分为2个指标:

  • 同比
  • 环比

根据统计周期的不同还可以分为:
环比分为:日环比、周环比、月环比和年环比
同比分为:日同比、周同比、月同比和年同比

同比

同比指的是本期数据和去年同期数据进行对比。
其中指的是统计的时间范围,比如年,月,周等。
统计周期为月,则称为月同比;统计周期为周,则称为周同比

同比主要是为了消除季节变化的影响,用以说明本期发展水平与去年同期发展水平对比而达到的相对发展速度;

适用于观察某个指标在不同年度的变化,其优势是可以去除大多数业务的季节因素,比如招聘2月是淡季,3月是旺季,做3月的分析使用环比实际上体现出的是招聘市场的变化,而不是公司销售额的变化,用同比则可以看出今年的增长情况,劣势是灵活性比较低,因为同比大多数是以年为单位,无法反映出数据的短期大量变化。

计算公式: 同比=(本期数-上年同期数)/上年同期数×100%

同比增长率举例来说,例如说去年2月的产值100万,今年2月的产值300万,问同比增长率是多少?
计算方法是同比增长率=(300-100)÷100=200%。

注意⚠️:
这里的除数要取绝对指,不然如果除数为负数,那么求出的比值就无法反应实际的增长情况了。
比如说去年2月营业额增长率是-20%,今年2月营业额的增长率是30%,问营业额增长率同比是多少?
计算方法是同比增长率=(20% + 20%) ÷(-20%)= - 200%,同期的营业额增长率明明是增长了,但是计算的结果却为负数,显然不能反应实际的增长率。

环比

环比指的是本期数据和上一期数据进行对比。

比如上周和本周、上月和本月、上季度和本季度等等,**用于表示数据的连续变化趋势,**优势是对于高速增长型业务可以非常好的体现出业务的增长趋势和事件的影响。

计算公式: 环比=(本期数-上期数)/上期数×100%

环比增长率举例来说,例如今年2月的产值100万,3月的产值300万,问环比增长率是多少?
计算方法是3月份的月环比增长率=(300-100)÷100=200%。

对比

1、对比基数不同:
同比的对比基数是上年的同一期间的数据,环比的基数则是上一期间的数据。

2、侧重点不同:
环比会突出显示数据的短期趋势,会受到季节等因素的影响。
同比更加侧重反映长期的大趋势,也就规避了季节的因素。

3、计算公式不同:
同比增长率=(本期数-上年同期数)/上年同期数×100%。
环比增长率=(本期数-上期数)/上期数×100%。

其他补充说明:
(1)如果计算结果为正值,则称增长率,如果计算为负值,则称下降率。
(2)环比中本期如果是本日、本周和本月,则上期相应指上一日、上一周和上一月;
同比中本期如果是本日、本周和本月,则同期相应指上年同一日、上年同一周和上年同一月;
(3)日环比则以每日的和作为比较条件,周环比以每月的和作为比较条件,月同比以每月的和作为比较条件。
(4)年环比和年同比是等同的,指年度的增长率。

二、同环比计算SQL

1.数据准备

新增商品销量表,并添加测试数据,然后统计对商品C1001进行同环比计算。

DROP TABLE if EXISTS sales;--  商品销量表
CREATE TABLE `sales` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`product_id` varchar(25) NOT NULL COMMENT '产品ID',`num` int(11) DEFAULT NULL COMMENT '销售数量',`create_date` timestamp(6) NULL DEFAULT NULL COMMENT '销售时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;求月环比和月同比:
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 12, '2020-01-02 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 32, '2020-01-07 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 12, '2020-01-27 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 16, '2020-02-06 3:00:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 10, '2020-03-05 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 23, '2020-04-04 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 21, '2020-04-03 0:10:12');
INSERT INTO sales(`product_id`,`num`,`create_date`)  VALUES ('C1001',26, '2020-05-02 0:10:12');
INSERT INTO sales(`product_id`,`num`,`create_date`) VALUES ('C1001', 15, '2020-06-01 10:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 32, '2020-07-07 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 16, '2020-08-06 3:0:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 10, '2020-09-05 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 23, '2020-10-04 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 21, '2020-11-03 0:10:12');
INSERT INTO sales(`product_id`,`num`,`create_date`)  VALUES ('C1001',26, '2020-12-02 0:10:12');
INSERT INTO sales(`product_id`,`num`,`create_date`) VALUES ('C1001', 15, '2020-12-05 10:10:12');INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 50, '2021-01-07 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 8, '2021-01-27 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 38, '2021-02-06 3:00:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 20, '2021-03-05 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 28, '2021-04-04 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 30, '2021-04-03 0:10:12');
INSERT INTO sales(`product_id`,`num`,`create_date`)  VALUES ('C1001',45, '2021-05-02 0:10:12');
INSERT INTO sales(`product_id`,`num`,`create_date`) VALUES ('C1001', 20, '2021-06-01 10:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 26, '2021-07-07 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 36, '2021-08-06 3:0:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 15, '2021-09-05 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 20, '2021-10-04 0:10:12');
INSERT INTO sales (`product_id`,`num`,`create_date`) VALUES ('C1001', 18, '2021-11-05 0:10:12');
INSERT INTO sales(`product_id`,`num`,`create_date`)  VALUES ('C1001',30, '2021-12-02 0:10:12');
INSERT INTO sales(`product_id`,`num`,`create_date`) VALUES ('C1001', 20, '2021-12-06 10:10:12');
INSERT INTO sales(`product_id`,`num`,`create_date`) VALUES ('C1001', 28, '2021-12-28 10:10:12');

2.年环比和年同比

由于年环比和年同比表示的意义是一致的,都是表示年度的增长率,所以没有在sql语句中重复计算。

SELECT ta.yy,ta.sumNum,concat(ifnull(round((ta.sumNum-tb.sumNum)/tb.sumNum*100,2),0),'%') as '年同比'
FROM (-- 内层的按年统计的自查询语句是相同的 SELECTt.product_id,year(t.create_date) as yy,sum(t.num) as sumNumFROMsales t WHERE product_id = 'C1001'GROUP BY t.product_id,yy
) ta
-- 上年同月
LEFT JOIN
(SELECTt.product_id,year(t.create_date) as yy,sum(t.num) as sumNumFROMsales t WHERE product_id = 'C1001'GROUP BY t.product_id,yy
) tb
ON   tb.yy = ta.yy-1
ORDER BY ta.yy
;

3.月环比和月同比

SELECT concat(ta.yy,'-',ta.mm) dateTime,ta.sumNum,tb.sumNum ytbSumNum,tc.sumNum yhbSumNum,-- 月同比   concat(ifnull(round((ta.sumNum-tb.sumNum)/tb.sumNum*100,2),0),'%') as '月同比',-- 月环比concat(ifnull(round((ta.sumNum-tc.sumNum)/tc.sumNum*100,2),0),'%') as '月环比'
FROM (SELECTt.product_id,year(t.create_date) as yy,month(t.create_date) as mm,sum(t.num) as sumNumFROM  sales t WHERE product_id = 'C1001'GROUP BY t.product_id,yy,mm
) ta
-- 同比:上年同月
LEFT JOIN
(SELECTt.product_id,year(t.create_date) as yy,month(t.create_date) as mm,sum(t.num) as sumNumFROM sales t WHERE product_id = 'C1001'GROUP BY t.product_id,yy,mm
) tb
ON  tb.mm = ta.mm  and tb.yy = ta.yy-1
-- 环比:上月
LEFT JOIN
(SELECTt.product_id,year(t.create_date) as yy,month(t.create_date) as mm,sum(t.num) as sumNumFROM sales t WHERE product_id = 'C1001'GROUP BY t.product_id,yy,mm
) tc
ON  ( (tc.yy = ta.yy and tc.mm = ta.mm - 1) OR (tc.yy=ta.yy - 1 AND tc.mm = 12 AND ta.mm = 1) )
ORDER BY dateTime
;

4.周环比和周同比

SELECT ta.yy,ta.mm,ta.ww,ta.sumNum,tb.sumNum wtbSumNum,tc.sumNum whbSumNum,concat(ifnull(round((ta.sumNum-tb.sumNum)/tb.sumNum*100,2),0),'%') as wtbRate,concat(ifnull(round((ta.sumNum-tc.sumNum)/tc.sumNum*100,2),0),'%') as whbRate
FROM (SELECTt.product_id,year(t.create_date) as yy,month(t.create_date) as mm,week(t.create_date) as ww,SUM(num) as sumNumFROM sales t WHERE product_id = 'C1001'GROUP BY t.product_id,yy,mm,ww
) ta
-- 同比:上年同月
LEFT JOIN
(SELECTt.product_id,year(t.create_date) as yy,month(t.create_date) as mm,week(t.create_date) as ww,SUM(num) as sumNumFROM sales t WHERE product_id = 'C1001'GROUP BY t.product_id,yy,mm,ww
) tb
ON  tb.mm = ta.mm and tb.ww = ta.ww and tb.yy = ta.yy-1
-- 环比:上一周
LEFT JOIN
(SELECTt.product_id,year(t.create_date) as yy,month(t.create_date) as mm,week(t.create_date) as ww,SUM(num) as sumNumFROM sales t WHERE product_id = 'C1001'GROUP BY t.product_id,yy,mm,ww
) tc
-- 1年有53周
ON  ( (tc.yy = ta.yy  and tc.ww = ta.ww - 1) OR (tc.yy=ta.yy - 1 AND tc.ww = 52 AND ta.ww = 0) )
ORDER BY yy,mm,ww
;

5.日环比和日同比

SELECT ta.ymd ,ta.sumNum,tb.sumNum rtbSumNum,tc.sumNum rhbSumNum,concat(ifnull(round((ta.sumNum-tb.sumNum)/tb.sumNum*100,2),0),'%') as rtbRate,concat(ifnull(round((ta.sumNum-tc.sumNum)/tc.sumNum*100,2),0),'%') as rhbRate
FROM (SELECTt.product_id,DATE_FORMAT(t.create_date,'%Y-%m-%d') ymd,sum(t.num) as sumNumFROM sales t WHERE product_id = 'C1001'GROUP BY t.product_id,ymd
) ta
-- 同比:上年同期
LEFT JOIN
(SELECTt.product_id,DATE_FORMAT(t.create_date,'%Y-%m-%d') ymd,sum(t.num) as sumNumFROM sales t WHERE product_id = 'C1001'GROUP BY t.product_id,ymd
) tb
-- 计算上年同期时间
ON  ta.ymd = date_add(tb.ymd, interval 1 year)
-- 环比:上期
LEFT JOIN
(SELECTt.product_id,DATE_FORMAT(t.create_date,'%Y-%m-%d') ymd,sum(t.num) as sumNumFROM sales t WHERE product_id = 'C1001'GROUP BY t.product_id,ymd
) tc
-- 计算上1天
ON  ta.ymd = date_add(tc.ymd, interval 1 day)
ORDER BY ta.ymd
;

总结

本文主要对同环比的概念和计算公式进行了说明,并介绍了在Mysql中如何通过SQL语句对销售量的同环比进行计算。

1、计算公式:
同比增长率=(本期数-上年同期数)/上年同期数×100%;
环比增长率=(本期数-上期数)/上期数×100%

2、使用sql语句计算同环比的过程中,需要注意不同数据库中日期计算函数的差异。

Mysql同环比计算详解相关推荐

  1. mysql日期时间操作函数详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. win7可以设定每周从哪一天开始,win2003等不能方便的修改.有的是周日开始,有的是周一开始.而 ...

  2. MySQL数据类型以及基本使用详解

    MySQL数据类型以及基本使用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL服务器的主要组件 我们知道MySQL的主要组件主要是由服务端(mysqld)和客户端 ...

  3. mysql日志文件开启及详解:General_log 和 Binlog

    log_bin=ON log_bin_basename=/var/lib/mysql/mysql-bin log_bin_index=/var/lib/mysql/mysql-bin.index Ge ...

  4. linux 用root安装mysql数据库_Linux上安装Mysql及简单的使用详解

    1. 安装mysql sudo apt-get update sudo apt-get install mysql-server sudo apt-get install python-mysqldb ...

  5. docker导入MySQL文件_Docker容器中Mysql数据的导入/导出详解

    前言 Mysql数据的导入导出我们都知道一个mysqldump命令就能够解决,但如果是运行在docker环境下的mysql呢? 解决办法其实还是用mysqldump命令,但是我们需要进入docker的 ...

  6. php mysql无限_php+mysql实现无限分类实例详解

    php+mysql实现无限分类实例详解 fenlei($arr[$i][0]);   //$arr[$i][1]表示第$i+1个分类的id的值.进行递归,也就是把自己的id作为f_id参数把自己的子类 ...

  7. 深入mysql慢查询设置的详解

    深入mysql慢查询设置的详解 在web开发中,我们经常会写出一些SQL语句,一条糟糕的SQL语句可能让你的整个程序都非常慢,超过10秒一般用户就会选择关闭网页,如何优化SQL语句将那些运行时间 比较 ...

  8. mysql查询语句详解_基于mysql查询语句的使用详解

    1> 查询数据表除了前三条以外的数据. 起初我想到的是这条语句 SELECT * FROM admin WHERE userid NOT IN (SELECT userid FROM admin ...

  9. 关于Tomcat与MySQL连接池问题的详解

    转载自   关于Tomcat与MySQL连接池问题的详解 研究了一天,终于有所收获,希望对大家有所帮助.首先请大家注意:这里尤其讨论Tomcat5.5版本中遇到的问题,为什么尤其单对这个版本,我一会儿 ...

  10. mysql入门优化_MySQL数据库:MySQL十大优化技巧详解

    本文主要向大家介绍了MySQL数据库的MySQL十大优化技巧详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. WEB开发者不光要解决程序的效率问题,对数据库的快速访问和相应也是 ...

最新文章

  1. B站讲演 | 我为什么要做科普视频?
  2. dycom游戏抽象空间框架正式版(alpha1.0)
  3. 清华大学计算机64班,清华大学计算机系的论比文评价.ppt
  4. hibernate xml配置文件
  5. 傅里叶变化的本质:复数的实部和虚部的对应关系
  6. Mysql用navicat操作导出查询结果
  7. 每日两SQL(2),欢迎交流~
  8. PHP实现文章的删除,php如何实现删除文章
  9. 软件与硬件我该选哪个_MacBook Air 和 MacBook Pro 该选哪个……?
  10. 小学奥数 7651 自来水供给 python
  11. asp建站系统源码_ASP.NET制造业进销存管理系统源码
  12. 百度android定位 602 key mcode不匹配,我的Android进阶之旅------百度地图学习:BDLocation.getLocType ( )值分析...
  13. android studio release error INSTALL_FAILED_INSUFFICIENT_STORAGE
  14. kubernetes pod往宿主机拷贝文件
  15. Atitit 微信开发文档总结获取token和菜单管理功能 /bookmarksHtmlEverythingIndexPrj/src/com/attilax/wechatToto/wechatMen
  16. 通过两点求圆心的公式
  17. android 投屏,华为手机的电脑模式是如何实现的
  18. 计算机报名503,503 service temporarily unavailable是什么意思【解决方法】
  19. 张恩民谈程序员“三点式” 学习方法
  20. 送学妹的生日礼物~ 制作一个超浪漫的告白3D相册(HTML+CSS+JavaScript)

热门文章

  1. 指令(MISP技术的指令集)
  2. 自媒体剪辑中常用的premere快捷键
  3. 移动芯片巨头英国ARM的发展史
  4. nmds与mds的区别_NMDS非度量多维尺度分析—基于微生物群落
  5. 关于tomcat报错500的问题记录(classnotfoundexception)
  6. html怎么显示五线谱,教你一个怎么看五线谱的绝招!
  7. 计算机的正确使用方法,电脑开关机的正确的操作步骤顺序(不会对电脑造成任何损坏)...
  8. PROFINET GSDML文件关键字和博图硬件目录关系
  9. matlab什么样的数表示0,matlab里a(i)~=0什么意思
  10. 大哉昆仑的 双英雄的无敌bug存档