sql语句下的同比,环比操作
sql语句下的同比,环比操作
题目:有两个表
表一:销售明细
表二:产品明细
需求:查询2020年,每月的销售额,以及同比环比,并按照年月进行升序排序
- 建数据库
- 建表
- 插入数据
偷个懒,这些语句就先省略了
给看个截图
ps: 建表时时间要选择datetime ,后面要对时间进行操作的~
思路:分步操作
- 获得每月的数据
首先的抽取时间,以及获得每个月的销售额,要有 销售额,两个表肯定是要连接起来的
------- 获取时间
YEAR(字段名)—获取年份
MONTH(字段名)----获取时间
SELECT YEAR(s.sail_time) 年, MONTH(s.sail_time) 月 , SUM(s.number*p.pro_price) 销售额 FROM sail_info s LEFT JOIN produce_detail p
ON s.produce_id=p.produce_id
GROUP BY YEAR(s.sail_time) , MONTH(s.sail_time)
此处使用左连接的原因:是要补充销售表里单品的价格,要以左表为基准,要用了左连接
结果:
- 单步操作获得同比数据
同比:一般情况下是今年第n月与去年第n月比
计算方式:同比增长率=(本期数-同期数)÷同期数×100%
所以要有个本期数据与同期数据一一对应的表,那就要本期数据与同期数据分离
有了第一步之后很容易获得数据
本期数据:
SELECT YEAR(s.sail_time) 年, MONTH(s.sail_time) 月 , SUM(s.number*p.pro_price) 销售额 FROM sail_info s LEFT JOIN produce_detail p
ON s.produce_id=p.produce_id
where YEAR(s.sail_time)=2020
GROUP BY YEAR(s.sail_time) , MONTH(s.sail_time)
同期数据:
SELECT YEAR(s.sail_time) 年, MONTH(s.sail_time) 月 , SUM(s.number*p.pro_price) 销售额 FROM sail_info s LEFT JOIN produce_detail p
ON s.produce_id=p.produce_id
where YEAR(s.sail_time)=2019
GROUP BY YEAR(s.sail_time) , MONTH(s.sail_time)
下面就要进行表的关联了
本期、同期的区别就是年份不一样,月份一样呗,那就用月份作为连接点进行连接,代码和结果截图如下,同比就完成了~
计算的是本期,本期数据是关键所以这边进行的是右连接—因为本期数据放在右边,放左边用左连接就好了
ps:如果觉得这边跳了步骤的话可以将查询结果改成 * 先去查看关联之后的表
SELECT CONCAT(e,'-',a) 年月, b 月销售额,
CASE WHEN d>0 THEN CONCAT((b-d)/d*100,'%') -- 转化为百分比,此处考虑到销售额为0的情况,分母不能为0,用case进行了条件判断ELSE "同期没有数据" END 同比 -- 这边的文字可以 换掉FROM
(SELECT YEAR(s.sail_time) f , MONTH(s.sail_time) c , SUM(s.number*p.pro_price) d FROM sail_info s LEFT JOIN produce_detail p
ON s.produce_id=p.produce_id WHERE YEAR(s.sail_time)=2019 GROUP BY MONTH(s.sail_time)) s2
RIGHT JOIN
(SELECT YEAR(s.sail_time) e,MONTH(s.sail_time) a , SUM(s.number*p.pro_price) b FROM sail_info s LEFT JOIN produce_detail p
ON s.produce_id=p.produce_id WHERE YEAR(s.sail_time)=2020 GROUP BY MONTH(s.sail_time)) s1
ON s1.a=s2.c
- 单步操作获得环比数据
环比:一般是指报告期水平与前一时期水平之比,此处指本月数据与上月数据
计算方式:环比增长速度=(本期数-上期数)÷上期数×100%
肯定也是要有表的关联了呗,怎么连呢???
既然是计算2020年的环比,那就以要计算的为基础数据,进行表的关联
上面已经有全部的年份、月份对应的数据,这一步主要是进行表的关联
两个表进行关联:
-1 2020年数据的表,即判断条件设置年份为2020的查询结果表
-2 考虑到2020年一月份对应的是2019年的12月份,所以这个张表是不加判断条件的表,包含了2019年和2020年数据的表
SELECT * FROM
(SELECT YEAR(s.sail_time) e,MONTH(s.sail_time) a , SUM(s.number*p.pro_price) 本期销售额 FROM sail_info s LEFT JOIN produce_detail p
ON s.produce_id=p.produce_id WHERE YEAR(s.sail_time)=2020 GROUP BY MONTH(s.sail_time)) s1
LEFT JOIN
(SELECT YEAR(s.sail_time) f, MONTH(s.sail_time) g, SUM(s.number*p.pro_price) 上期销售额 FROM sail_info s LEFT JOIN produce_detail p
ON s.produce_id=p.produce_id GROUP BY MONTH(s.sail_time),YEAR(s.sail_time)) s3
ON ((s1.a-1)=s3.g AND s1.e=s3.f) OR (s1.a=1 AND s3.g=12 AND s3.f=2019)
解析以下这个:
(s1.a-1)=s3.g AND s1.e=s3.f
这个是针对2020年2月份的数据,2020 02-06 的数据与2020 01-05的数据一一对应
按关联前的,a(月份)和g(月份)应该是相等的,因为对比的是上一期的,所以要错开,大的减掉等与小的
那一月份怎么办呢??
s1.a=1 AND s3.g=12 AND s3.f=2019
这边就不能用上面的办法了,跨年了,所以需要用and连接的方式进行限制,而且需要限定为2019年的12月份,这边因为数据比较少,不限定年份也没问题
两个部分用 or 并列存在,两个条件要分别用括号括起来,否则这个查询条件等于没有。。。。
把* 换成
CONCAT(e,'-',a) 年月,f 月销售额, CASE WHEN h>0 THEN CONCAT((b-h)/h*100,'%')ELSE "上期没有数据" END 环比
执行查询:
- 最后一步,将数据放到一个表里~
通过上述说明,可以发现都关联了2020年数据查询的表,所以可以将这个表放在中间 ,三个表进行关联(也是操作同比数据用右连接的原因)
CASE WHEN d>0 THEN CONCAT((b-d)/d*100,'%')ELSE "同期没有数据" END 同比 , CASE WHEN h>0 THEN CONCAT((b-h)/h*100,'%')ELSE "上期没有数据" END 环比FROM
(SELECT MONTH(s.sail_time) c , SUM(s.number*p.pro_price) d ,YEAR(s.sail_time) ye FROM sail_info s LEFT JOIN produce_detail p
ON s.produce_id=p.produce_id WHERE YEAR(s.sail_time)=2019 GROUP BY MONTH(s.sail_time)) s2
RIGHT JOIN
(SELECT MONTH(s.sail_time) a , SUM(s.number*p.pro_price) b ,YEAR(s.sail_time) e FROM sail_info s LEFT JOIN produce_detail p
ON s.produce_id=p.produce_id WHERE YEAR(s.sail_time)=2020 GROUP BY MONTH(s.sail_time)) s1
ON s1.a=s2.c
LEFT JOIN
(SELECT YEAR(s.sail_time) f, MONTH(s.sail_time) g, SUM(s.number*p.pro_price) h FROM sail_info s LEFT JOIN produce_detail p
ON s.produce_id=p.produce_id GROUP BY MONTH(s.sail_time),YEAR(s.sail_time)) s3 ON ((s1.a-1)=s3.g AND s1.e=s3.f) OR
(s1.a=1 AND s3.g=12 AND s3.f=2019) ORDER BY CONCAT(e,'-',a)
结束!
sql语句下的同比,环比操作相关推荐
- python连接sqlserver 多条sql语句后提交_利用python操作sqllite
SQLite3 可使用 sqlite3 模块与 Python 进行集成.sqlite3 模块是由 Gerhard Haring 编写的.它提供了一个与 PEP 249 描述的 DB-API 2.0 规 ...
- SQL语句,常用的DDL表操作语句
-- ddl sql 语句 -- 创建表 create table user_t( id int primary key auto_increment, -- 自增主键 name va ...
- 怎么做蒙特卡洛计算npv_PowerBI非标准日历下的同比环比计算,你知道怎么做吗?...
对于按照自然年月日来分析的业务数据,在PowerBI中可以轻松的使用时间智能函数来进行各种时间指标的计算,但如果不是按标准的日历,很多人就开始有点懵,不知道该如何计算了. 比如有的公司的业务月份是从 ...
- SQL语句之UNION和UNION ALL操作用法
UNION 操作符用于合并两个或多个 SELECT 语句的结果集. UNION是取交集,去除相同的数据,只保留一条数据. UNION 内部注意 每个 SELECT 语句必须拥有相同数量的列. 列也必须 ...
- Spring Boot笔记-JPA自定义SQL语句参数为对象时如何操作
环境: SpringBoot v2.1.10.RELEASE 举个例子: @Modifying @Query(nativeQuery = true, value = "update XXX. ...
- cmd执行服务器sql文件命令行,Dos命令提示符下 - 用sqlcmd执行*.sql语句
Dos命令提示符下 - 用sqlcmd执行*.sql语句 1)在Dos命令下执行sqlcmd命令(当然事先需要将sqlcmd增加到环境变量中去), 2)下面白色部分替换为服务器名或计算机名即可 sql ...
- Navicat工具获取操作数据库和表的SQL语句
工具 Navicat Premium 15 MySQL服务器技术 SQL语句MySQL 在使用Navicat Premium 15客户端时,对数据库和表进行操作,会产生SQL语句.有时我们不记得SQL ...
- 常用SQL语句书写技巧-
SQL结构化查询字符串的改写,是实现数据库查询性能提升的最现实.最有效的手段,有时甚至是唯一的手段,比如在不允许大幅度修改现有数据库结构的情况下. 通过优化SQL语句提高查询性能的关键是: ? 根据实 ...
- navicat循环执行上下两行相减sql语句_SQL太难?你离完全理解SQL就差这10步!
- 点击上方"中国统计网"设置⭐星标不迷路!- 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语 ...
- 为什么使用@tablename起别名产生的sql语句不能用_10个简单步骤,完全理解SQL
多年前收藏在笔记中的一篇文章,今天偶然翻出,重读了一遍,依然大有收获.分享出来,大家一起探讨. 以本文是为了以下读者而特地编写的: 1. 在工作中会用到 SQL 但是对它并不完全了解的人. 2. 能够 ...
最新文章
- 8个计算机视觉深度学习中常见的Bug
- c#加粗代码_RichTextBox,怎么用c#代码根据Index和Length指定的范围的内容进行变色或加粗处理?...
- Linux 解压缩tar经历,Linux命令 -- tar解压缩命令
- python画切片图_python|Python图片常用操作-索引与切片
- 中国机器人减速机行业十四五发展规划及未来需求预测报告2021-2027年
- hashMap和hashTable的区别(个人总结)
- Elasticsearch技术解析与实战(三)文档的聚合
- “约见”面试官系列之常见面试题第二十二篇之函数闭包(建议收藏)
- 嘉立创又搞大事情了,与你我相关!
- 工程从进场到竣工 资料报验的一般程序
- 爬虫之煎蛋网妹子图 大爬哦
- Python帮助文档的设置
- 如何去除html的flash,去除网站Flash动画效果,提升seo优化友好度
- 关于virtualbox无法复制粘贴的问题
- ArcGis Server10.2 授权文件教程
- Ubuntu 笔记本合上盖子时,不进入休眠
- Linux中的stdout和stderr
- 使用机器学习模型预测贷款资格
- AtCoder Regular Contest 154 题解
- RHCE 第五次作业
热门文章
- ubuntu PHP Cannot adopt OID in UCD-SNMP-MIB
- C51单片机实验系列:循环左移点亮流水灯_crol_
- 开放大学毕业生自我鉴定计算机,开放大学毕业生自我鉴定范文500字(精选7篇)...
- 要点初见:安装教程与二度拓展——基于SUMO的Flow Project(附代码链接)
- 【吐槽】那些让人“口吐芬芳”的App登录骚操作
- 华为od德科面试数据算法解析 2022-3-20 关于员工工号问题
- 瞬态抑制二极管有方向吗?
- STM32定时器US延时
- 智能电视机顶盒开发记录
- 全球与中国电力系统同步时钟市场深度研究分析报告