大体思路:

MySQL没有类似oracle方便的统计函数,只能靠自己去硬计算:通过时间字段直接增加年份、月份,然后通过left join关联时间字段去计算环比、同比公式即可

原始表结构:

求同比SQL:

  1. -- 按年同比
  2. SELECT t5.*, CASE WHEN t5.last_energy_year IS NULL OR t5.last_energy_year =0 THEN 0.00
  3. ELSE FORMAT(((t5.energy_year - t5.last_energy_year)/t5.last_energy_year)*100,2)
  4. END YoY  -- 同比
  5. FROM (
  6. SELECT t3.*,t4.last_energy_year
  7. FROM
  8. (
  9. SELECT DATE_FORMAT(CONCAT(t1.`tyear`, '-', t1.`tmonth`,'-01'),'%Y-%m-%d') AS YearMonth,t1.tyear,SUM(t1.energy_month) energy_year,t1.linename
  10. FROM(SELECT
  11. t.*,COUNT(DISTINCT t.`tyear`,t.`tmonth`,t.`linename`) c_cot
  12. FROM `ksh_tgyjy_llxgyjydlxx` t
  13. GROUP BY t.`linename`,t.`tyear`,t.`tmonth`,t.`linename`) t1
  14. GROUP BY t1.tyear,t1.`linename`
  15. ) t3
  16. LEFT JOIN
  17. (
  18. SELECT DATE_ADD(DATE_FORMAT(CONCAT(t1.`tyear`, '-', t1.`tmonth`,'-01'),'%Y-%m-%d'),INTERVAL 1 YEAR) AS lastYearMonth,t1.tyear,SUM(t1.energy_month) last_energy_year,t1.linename
  19. FROM(SELECT t.*,COUNT(DISTINCT t.`tyear`,t.`tmonth`,t.`linename`) c_cot
  20. FROM `ksh_tgyjy_llxgyjydlxx` t
  21. GROUP BY t.`linename`,t.`tyear`,t.`tmonth`,t.`linename`) t1
  22. GROUP BY t1.tyear,t1.`linename`
  23. ) t4
  24. ON t3.YearMonth = t4.lastYearMonth
  25. AND t3.linename = t4.linename
  26. ) t5
-- 按年同比

SELECT t5., CASE WHEN t5.last_energy_year IS NULL OR t5.last_energy_year =0 THEN 0.00

                ELSE FORMAT(((t5.energy_year - t5.last_energy_year)/t5.last_energy_year)
100,2)

        END YoY  -- 同比

FROM (

   SELECT t3.,t4.last_energy_year

    FROM

    (

       SELECT DATE_FORMAT(CONCAT(t1.tyear, '-', t1.tmonth,'-01'),'%Y-%m-%d') AS YearMonth,t1.tyear,SUM(t1.energy_month) energy_year,t1.linename

        FROM(SELECT

        t.
,COUNT(DISTINCT t.tyear,t.tmonth,t.linename) c_cot

        FROM ksh_tgyjy_llxgyjydlxx t

        GROUP BY t.linename,t.tyear,t.tmonth,t.linename) t1

        GROUP BY t1.tyear,t1.linename

     ) t3

      LEFT JOIN

    (

      SELECT DATE_ADD(DATE_FORMAT(CONCAT(t1.tyear, '-', t1.tmonth,'-01'),'%Y-%m-%d'),INTERVAL 1 YEAR) AS lastYearMonth,t1.tyear,SUM(t1.energy_month) last_energy_year,t1.linename

        FROM(SELECT t.,COUNT(DISTINCT t.tyear,t.tmonth,t.linename) c_cot

        FROM ksh_tgyjy_llxgyjydlxx t

        GROUP BY t.linename,t.tyear,t.tmonth,t.linename) t1

        GROUP BY t1.tyear,t1.linename

    ) t4

    ON t3.YearMonth = t4.lastYearMonth

    AND t3.linename = t4.linename

) t5

查询结果:

求月环比SQL:

  1. -- 按月同比  
  2.   
  3. SELECT DATE_FORMAT(t5.YearMonth,'%Y-%m') YearMonth,t5.linename,t5.energy_month,   
  4.          CASE WHEN t5.lat_energy_month IS NULL OR t5.lat_energy_month=0 THEN 0.00  
  5.                  ELSE FORMAT(((t5.energy_month - t5.lat_energy_month)/t5.lat_energy_month)100,2)   
  6.         END YoY  
  7. FROM (   
  8.    SELECT t3.,t4.energy_month lat_energy_month  
  9.      FROM   
  10.     (  
  11.       SELECT DATE_FORMAT(CONCAT(t1.tyear, '-', t1.tmonth,'-01'),'%Y-%m-%d') AS YearMonth,t1.  
  12.         FROM(SELECT   
  13.           t.,COUNT(DISTINCT t.tyear,t.tmonth,t.linename) c_cot   
  14.           FROM ksh_tgyjy_llxgyjydlxx t   
  15.           GROUP BY t.linename,t.tyear,t.tmonth,t.linename) t1  
  16.      ) t3   
  17.        LEFT JOIN   
  18.     (  
  19.       SELECT DATE_ADD(DATE_FORMAT(CONCAT(t1.tyear, '-', t1.tmonth,'-01'),'%Y-%m-%d'),INTERVAL 1 YEAR) AS lastYearMonth,t1.   
  20.         FROM(SELECT t.*,COUNT(DISTINCT t.tyear,t.tmonth,t.linename) c_cot   
  21.         FROM ksh_tgyjy_llxgyjydlxx t   
  22.         GROUP BY t.linename,t.tyear,t.tmonth,t.linename) t1  
  23.     ) t4  
  24.     ON t3.YearMonth = t4.lastYearMonth  
  25.     AND t3.linename = t4.linename  
  26. ) t5  
-- 按月同比

SELECT DATE_FORMAT(t5.YearMonth,'%Y-%m') YearMonth,t5.linename,t5.energy_month,

         CASE WHEN t5.lat_energy_month IS NULL OR t5.lat_energy_month=0 THEN 0.00

                 ELSE FORMAT(((t5.energy_month - t5.lat_energy_month)/t5.lat_energy_month)100,2)

        END YoY

FROM (

   SELECT t3.
,t4.energy_month lat_energy_month

     FROM

    (

      SELECT DATE_FORMAT(CONCAT(t1.tyear, '-', t1.tmonth,'-01'),'%Y-%m-%d') AS YearMonth,t1.*

        FROM(SELECT

          t.,COUNT(DISTINCT t.tyear,t.tmonth,t.linename) c_cot

          FROM ksh_tgyjy_llxgyjydlxx t

          GROUP BY t.linename,t.tyear,t.tmonth,t.linename) t1

     ) t3

       LEFT JOIN

    (

      SELECT DATE_ADD(DATE_FORMAT(CONCAT(t1.tyear, '-', t1.tmonth,'-01'),'%Y-%m-%d'),INTERVAL 1 YEAR) AS lastYearMonth,t1.


        FROM(SELECT t.*,COUNT(DISTINCT t.tyear,t.tmonth,t.linename) c_cot

        FROM ksh_tgyjy_llxgyjydlxx t

        GROUP BY t.linename,t.tyear,t.tmonth,t.linename) t1

    ) t4

    ON t3.YearMonth = t4.lastYearMonth

    AND t3.linename = t4.linename

) t5

查询结果:

MySQL统计同比环比SQL的更多相关文章

  1. mysql统计类似SQL语句查询次数

    mysql统计类似SQL语句查询次数 vc-mysql-sniffer 工具抓取的sql分析. 1.先用shell脚本把所有enter符号替换为null,再根据语句前后的字符分隔语句 grep -Ev ...

  2. 如何查找MySQL中查询慢的SQL语句

    如何查找MySQL中查询慢的SQL语句 更多 如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow ...

  3. 如何查找MySQL中查询慢的SQL语句(转载)

    转载自https://www.cnblogs.com/qmfsun/p/4844472.html 如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那 ...

  4. 何在mysql查找效率慢的SQL语句?

    如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启 ...

  5. MySQL基础操作&&常用的SQL技巧&&SQL语句优化

    基础操作     一:MySQL基础操作         1:MySQL表复制             复制表结构 + 复制表数据             create table t3 like t ...

  6. 数据库MySQL经典面试题之SQL语句

    数据库MySQL经典面试题之SQL语句 1.需要数据库表1.学生表Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学 ...

  7. MySQL统计信息简介

    作者:王小龙@网易乐得DBA 原文地址: http://mp.weixin.qq.com/s/698g5lm9CWqbU0B_p0nLMw MySQL执行SQL会经过SQL解析和查询优化的过程,解析器 ...

  8. Mysql统计每年每个月的数据——详细教程

    Mysql统计每年每个月的数据(前端页面统计图实现) 最终想实现的效果图,在这里就不多废话了,直接上效果图,由于测试数据有几个月是为0的,所以数据图看着会有点怪怪. 接下来是数据库的两个表,这里直接给 ...

  9. MySQL性能优化(四):SQL优化

    原文:MySQL性能优化(四):SQL优化 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ ...

随机推荐

  1. python 字符串的处理技巧--join

    >>> '+'.join('1234')'1+2+3+4'>>> '+'.join(a for a in '1234')'1+2+3+4'>>> ...

  2. IO流10 --- 缓冲流(字节型)实现非文本文件的复制 --- 技术搬运工(尚硅谷)

    字节型缓冲流,BufferedOutputStream默认缓冲区大小 8192字节byte,满了自动flush() @Test public void test6(){ File srcFile = ...

  3. django中的聚合索引

    Django(元信息)元类建索引 ORM查询(sql优化)优化 自定义聚合函数 Django的元类建索引————索引:索引的一个主要目的就是加快检索表中数据,索引是经过某种算法优化过的,因而查找次数要 ...

  4. Linux/UNIX之信号(1)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/walkerkalr/article/details/24462723 信号(1) 信号是软件中断.每 ...

  5. pycharm使用gitlab输错密码解决办法

    在pycharm中使用http方式连接gitlab,在测试连接的时候提示输入用户名,密码.密码输错后,以后的每次test都是使用错误的密码,在删除pycharm后也是一样,解决方法是在控制面板\用户帐 ...

  6. HR招聘_(九)_招聘方法论(面试环节·薪资谈判和心理把控)

    .薪资谈判 薪资谈判在整个过程中非常重要,如果这一环出现问题前期的所有付出都功亏一篑,无法达成招聘目标. 谈判过程中需要遵循以下原则: 明确 通过面试后需要再次确认候选人的目前薪资和期望,虽然第一次电 ...

  7. php7不再支持HTTP_RAW_POST_DATA,微信支付$GLOBALS[‘HTTP_RAW_POST_DATA’]获取不到数据,

    升级到php7后, 发现旧的web系统有些问题, 查看后才发现原来是php7不再支持HTTP_RAW_POST_DATA 原来系统一些地方, 使用$GLOBALS[‘HTTP_RAW_POST_DAT ...

  8. 软工作业———Alpha版本第二周小结

    姓名 学号 周前计划安排 每周实际工作记录 自我打分 zxl 061425 1.进行任务分配2.实现扫码和生成二维码功能 1.对主要任务进行了划分,但还为进行给模块间的联系2.完成了扫码签到功能 90 ...

  9. Codeforces Round #197 (Div. 2) A. Helpful Maths【字符串/给一个连加计算式,只包含数字 1、2、3,要求重新排序,使得连加的数字从小到大】

    A. Helpful Maths time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  10. 第一周<导学>

    导学 欧氏距离 平方 曼哈顿距离 一次方 马氏距离 协方差(先标准化再计算距离)\(d(x_{i},x_{j})=\sqrt{(x_{i}-x_{j})^{T}s^{-1}(x_{i}-x{j})}\ ...