大体思路:

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

查询结果:

最新文章

  1. Web开发技术发展历史
  2. 新增的querySelector、querySelectorAll测试
  3. 二、Ubuntu14.04下安装Hadoop2.4.0 (伪分布模式)
  4. 多界面开发 、 导航控制器(NavigationController)
  5. class-dump-z下载地址
  6. 李洪强iOS开发本人集成环信的经验总结_03_注册
  7. Could not Build module ImageIO
  8. CSS3:三个矩形,一个宽200px,其余宽相等且自适应满铺
  9. 开启MySQL远程访问权限 允许远程连接
  10. [转]Angular引入第三方库
  11. ARMV7-M数据手册---Part A :Application Level Architecture---A1 Introduction
  12. h5新增内容
  13. openwrt 无线中继
  14. INCLUDE COMMON FILES IN HTML USING JQUERY
  15. CentOS 7安装图形化界面后重启出现Initial setup of CentOS Linux 7 (core)
  16. mysql 排序 oder by 和 使用hibernate 排序
  17. jQuery $.ajax 参数说明及调用注意事项
  18. debian linux 下设置开机自启动
  19. 【2015蓝桥杯省赛】C++ B组试题
  20. oracle中将number类型毫秒值转为时间类型

热门文章

  1. 面试Nginx的几个常见问题(
  2. nslookup查不到数据
  3. 服务器安装软件时提示Error launching installer
  4. 你应该知道的25个非常有用的CSS技巧
  5. update当根据条件不同时 更新同一个字段的方法 或多表插入
  6. 2019.9.18 csp-s模拟测试46 反思总结
  7. QT生成GUID
  8. ASP.NET CORE使用MailKit的一个故障点分析
  9. .Net Core 授权系统组件解析
  10. screen 基础用法(转)