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

题目:有两个表
表一:销售明细

表二:产品明细

需求:查询2020年,每月的销售额,以及同比环比,并按照年月进行升序排序

  1. 建数据库
  2. 建表
  3. 插入数据
    偷个懒,这些语句就先省略了
    给看个截图


    ps: 建表时时间要选择datetime ,后面要对时间进行操作的~

思路:分步操作

  1. 获得每月的数据
    首先的抽取时间,以及获得每个月的销售额,要有 销售额,两个表肯定是要连接起来的
    ------- 获取时间
    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)

此处使用左连接的原因:是要补充销售表里单品的价格,要以左表为基准,要用了左连接
结果:

  1. 单步操作获得同比数据
    同比:一般情况下是今年第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

  1. 单步操作获得环比数据
    环比:一般是指报告期水平与前一时期水平之比,此处指本月数据与上月数据
    计算方式:环比增长速度=(本期数-上期数)÷上期数×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 环比

执行查询:

  1. 最后一步,将数据放到一个表里~
    通过上述说明,可以发现都关联了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语句下的同比,环比操作相关推荐

  1. python连接sqlserver 多条sql语句后提交_利用python操作sqllite

    SQLite3 可使用 sqlite3 模块与 Python 进行集成.sqlite3 模块是由 Gerhard Haring 编写的.它提供了一个与 PEP 249 描述的 DB-API 2.0 规 ...

  2. SQL语句,常用的DDL表操作语句

    -- ddl sql 语句 -- 创建表 create table user_t(     id int primary key auto_increment, -- 自增主键     name va ...

  3. 怎么做蒙特卡洛计算npv_PowerBI非标准日历下的同比环比计算,你知道怎么做吗?...

    ​对于按照自然年月日来分析的业务数据,在PowerBI中可以轻松的使用时间智能函数来进行各种时间指标的计算,但如果不是按标准的日历,很多人就开始有点懵,不知道该如何计算了. 比如有的公司的业务月份是从 ...

  4. SQL语句之UNION和UNION ALL操作用法

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集. UNION是取交集,去除相同的数据,只保留一条数据. UNION 内部注意 每个 SELECT 语句必须拥有相同数量的列. 列也必须 ...

  5. Spring Boot笔记-JPA自定义SQL语句参数为对象时如何操作

    环境: SpringBoot v2.1.10.RELEASE 举个例子: @Modifying @Query(nativeQuery = true, value = "update XXX. ...

  6. cmd执行服务器sql文件命令行,Dos命令提示符下 - 用sqlcmd执行*.sql语句

    Dos命令提示符下 - 用sqlcmd执行*.sql语句 1)在Dos命令下执行sqlcmd命令(当然事先需要将sqlcmd增加到环境变量中去), 2)下面白色部分替换为服务器名或计算机名即可 sql ...

  7. Navicat工具获取操作数据库和表的SQL语句

    工具 Navicat Premium 15 MySQL服务器技术 SQL语句MySQL 在使用Navicat Premium 15客户端时,对数据库和表进行操作,会产生SQL语句.有时我们不记得SQL ...

  8. 常用SQL语句书写技巧-

    SQL结构化查询字符串的改写,是实现数据库查询性能提升的最现实.最有效的手段,有时甚至是唯一的手段,比如在不允许大幅度修改现有数据库结构的情况下. 通过优化SQL语句提高查询性能的关键是: ? 根据实 ...

  9. navicat循环执行上下两行相减sql语句_SQL太难?你离完全理解SQL就差这10步!

    - 点击上方"中国统计网"设置⭐星标不迷路!- 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语 ...

  10. 为什么使用@tablename起别名产生的sql语句不能用_10个简单步骤,完全理解SQL

    多年前收藏在笔记中的一篇文章,今天偶然翻出,重读了一遍,依然大有收获.分享出来,大家一起探讨. 以本文是为了以下读者而特地编写的: 1. 在工作中会用到 SQL 但是对它并不完全了解的人. 2. 能够 ...

最新文章

  1. 8个计算机视觉深度学习中常见的Bug
  2. c#加粗代码_RichTextBox,怎么用c#代码根据Index和Length指定的范围的内容进行变色或加粗处理?...
  3. Linux 解压缩tar经历,Linux命令 -- tar解压缩命令
  4. python画切片图_python|Python图片常用操作-索引与切片
  5. 中国机器人减速机行业十四五发展规划及未来需求预测报告2021-2027年
  6. hashMap和hashTable的区别(个人总结)
  7. Elasticsearch技术解析与实战(三)文档的聚合
  8. “约见”面试官系列之常见面试题第二十二篇之函数闭包(建议收藏)
  9. 嘉立创又搞大事情了,与你我相关!
  10. 工程从进场到竣工 资料报验的一般程序
  11. 爬虫之煎蛋网妹子图 大爬哦
  12. Python帮助文档的设置
  13. 如何去除html的flash,去除网站Flash动画效果,提升seo优化友好度
  14. 关于virtualbox无法复制粘贴的问题
  15. ArcGis Server10.2 授权文件教程
  16. Ubuntu 笔记本合上盖子时,不进入休眠
  17. Linux中的stdout和stderr
  18. 使用机器学习模型预测贷款资格
  19. AtCoder Regular Contest 154 题解
  20. RHCE 第五次作业

热门文章

  1. ubuntu PHP Cannot adopt OID in UCD-SNMP-MIB
  2. C51单片机实验系列:循环左移点亮流水灯_crol_
  3. 开放大学毕业生自我鉴定计算机,开放大学毕业生自我鉴定范文500字(精选7篇)...
  4. 要点初见:安装教程与二度拓展——基于SUMO的Flow Project(附代码链接)
  5. 【吐槽】那些让人“口吐芬芳”的App登录骚操作
  6. 华为od德科面试数据算法解析 2022-3-20 关于员工工号问题
  7. 瞬态抑制二极管有方向吗?
  8. STM32定时器US延时
  9. 智能电视机顶盒开发记录
  10. 全球与中国电力系统同步时钟市场深度研究分析报告