计算需求:
1.求原始数据JS.TOPARTYNAME(购电方)的同比增长率

2.求原始数据华东购电(总计)=上海+江苏+浙江+福建+安徽的同比增长率

分析过程:
1.首先,我们要理解什么是同比?
同比一般情况下是今年第n月与去年第n月比。同比发展速度主要是为了消除季节变动的影响,
用以说明本期发展水平与去年同期发展水平对比而达到的相对发展速度。如,本期2月比去年2月,本期6月比去年6月等。
那么,我们求的是同比增长率,其公式见下:

同比增长率=(本期数-同期数)/同期数*100% 指和去年同期相比较的增长率

2.理解同比的基本概念后,我们要知道在Oracle同比的基本求法?

这里我要介绍下Oracle的Lag函数:
Lag分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)作为独立的列。
这种操作可以代替表的自联接,并且LAG有更高的效率。
/*语法*/
lag(exp_str,offset,defval) over()
--exp_str要取的列
--offset取偏移后的第几行数据
--defval:没有符合条件的默认值

同时使用NVL和Round函数:

NVL函数格式为:

NVL( string1, replace_with)

功能:如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL。

Round函数语法:
round(number,digits) 
参数:
number,要四舍五入的数,digits是要小数点后保留的位数
  --如果 digits 大于 0,则四舍五入到指定的小数位。 
  --如果 digits 等于 0,则四舍五入到最接近的整数

--如果 digits 小于 0,则在小数点左侧进行四舍五

3.了解oracle求同比的基本用法,我们需要具体应用到源是数据查询中,但是分析原始数据,发现源数据并不是规律连续的,见下图

那么这带来的问题是我们并不能向上面讲的那样简单的去使用lag函数了,那怎么办呢?

想到先整理数据后,再去使用函数分析查询是一个好办法,于是有了下方的解决办法:

A.求原始数据JS.TOPARTYNAME(购电方)的同比增长率

with tb as(select to_char(t.t_date, 'YYYY') year, to_char(t.t_date, 'MM') month, t.*from TRY_OPT_MON_ELEC_JS twhere t.FYGZ = 'Z'and t.js_elec <> 0and t.js_kind in ('四川水电送华东月度1', '四川水电送华东短期2', '四川水电送华东短期3', '四川水电送浙江年度','四川水电送江苏年度', '三峡送华东', '向家坝送上海交易', '锦东锦西官地送江苏交易','四川水电送华东短期1', '溪洛渡送浙江', '锦东锦西官地送江苏交易', '溪洛渡左岸送浙江交易')
)
select max(t.t_date) 日期,t.topartyname 购电方,t.js_elec 结算电量,t.js_kind 结算品种,nvl(round(((t.js_elec - (lag(t.js_elec,1) over(partition by t.month, t.topartyname,t.js_kind order by t.year)))/((lag(t.js_elec,1) over(partition by t.month, t.topartyname,t.js_kind order by t.year))))*100,2),'0')||'%' as 同比from tb twhere 1=1group by t.js_kind,t.topartyname, t.year, t.month, t.js_elecorder by t.month

思路分析:
1.创建临时表tb 
2.把t_date日期字段拆分为年、月两个字段方便分组,筛去js_elec(售电量)为零的记录是,筛去不需要的js_kind(结算品种)
3.使用lag分析函数求得同比值
4.使用round函数格式化两位小数

5.使用nvl函数满足空值补零

查询结果:

B.求原始数据华东购电(总计)=上海+江苏+浙江+福建+安徽的同比增长率

with tb as(select to_char(t.t_date, 'YYYY') year, to_char(t.t_date, 'MM') month, t.*from TRY_OPT_MON_ELEC_JS twhere t.FYGZ = 'Z'and t.js_elec <> 0and t.js_kind in ('四川水电送华东月度1', '四川水电送华东短期2', '四川水电送华东短期3', '四川水电送浙江年度','四川水电送江苏年度', '三峡送华东', '向家坝送上海交易', '锦东锦西官地送江苏交易','四川水电送华东短期1', '溪洛渡送浙江', '锦东锦西官地送江苏交易', '溪洛渡左岸送浙江交易')and t.topartyname in ('上海','江苏','浙江','福建','安徽')
)
,tb2 as(
select max(t.t_date) t_date, sum(t.js_elec) js_elec, t.year, t.month
from tb t
group by t.year, t.month
)
select max(t.t_date) 日期,'华东' 华东,t.js_elec 结算电量,nvl(round(((t.js_elec - (lag(t.js_elec,1) over(partition by t.month order by t.year)))/((lag(t.js_elec,1) over(partition by t.month order by t.year))))*100,2),'0')||'%' as 同比from tb2 twhere 1=1group by t.year, t.month, t.js_elecorder by t.year,t.month

思路分析:
1.创建临时表tb 
2.把t_date日期字段拆分为年、月两个字段方便分组,筛去js_elec(售电量)为零的记录是,筛去不需要的js_kind(结算品种)和不是华东区的购电单位
3.使用lag分析函数求得同比值
4.使用round函数格式化两位小数

5.使用nvl函数满足空值补零

查询结果:

Oracle求同比SQL相关推荐

  1. oracle 统计同比 环比,oracle求同比,环比函数(LAG与LEAD)的详解

    Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值.这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率. 复制代码 代码如下: CREATE TABL ...

  2. oracle按年同比环比,oracle求同比,环比函数(LAG与LEAD)的详解

    Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值.这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率. 相关操作代码如下: CREATE TABLE ...

  3. oracle求同比,环比函数 LAG和LEAD

    Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值.这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率. CREATE TABLE salaryByM ...

  4. oracle 不等函数,SQL(Oracle)日常使用与不常使用函数的汇总

    --日常使用的sql语句和oracle语句,有些相对使用的频率比较高,收藏起来还是比较值得的 -- 绝对值 SQL:select abs(-1) value Oracle:select abs(-1) ...

  5. Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作

    Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很 ...

  6. oracle stdevp函数,SQL Server与oracle两者区别之函数区别

    Oracle和SQL Server的常用函数对比 1.数学函数 ①绝对值 S:select abs(-1) value O:select abs(-1) value from dual ②取整(大) ...

  7. Oracle 实验五:Oracle中的SQL使用

    实验五:Oracle中的SQL使用 一.实验目的 1.掌握SQL语言中常用系统函数: 2.掌握SQL语言的应用. 二.实验内容 1. 查询SQL中如下常用函数的使用,并举例说明(完成格式参考Lengt ...

  8. oracle 求A中不存在于B的记录

    oracle 求A中不存在于B的记录 select * from a minus select * from b  是求A中不存在于B的记录 select * from a union select ...

  9. 监控Oracle性能的SQL

    监控Oracle性能的SQL 1. 监控事例的等待     select event,sum(decode(wait_Time,0,0,1)) "Prev",    sum(dec ...

最新文章

  1. python不能加密吗_为什么我不能解密我用pycrypto加密的内容?
  2. R语言常用包分类总结
  3. 泥浆配制_朝政泥浆——广西田阳县百东河水库溢洪道穿越钻泥浆配制简述(3)...
  4. 复杂网络社区结构划分方法
  5. Asp.Net中的MapPath目录问题
  6. Java Double类doubleToLongBits()方法与示例
  7. php 字符串0转换bool_PHP数据类型转换(转)
  8. 【计算机科学基础】VonNeumann体系结构
  9. try-catch的使用以及细节
  10. 对于spring的一些巩固一些难点的理解 2021-04-18
  11. 用计算机画 信息技术课标要求,[引用]小学信息技术课程标准
  12. html页面布局代码bootstrap,Bootstrap3.0学习笔记之页面布局
  13. Asp.net实现MVC处理文件的上传下载删除功能实例教程
  14. 12、设计模式-结构型模式-外观模式
  15. ArcGIS地图文档(mxd)过大的问题
  16. 应用安全-软件安全-漏洞CVE整理
  17. 注解实现接口拦截功能
  18. 在Access数据库中使用SQL查询分析器
  19. Java基础 - 网络编程 - netstat指令,UDP通信编程和网络编程总练习
  20. 基于Vivado和Ego1的密码锁设计

热门文章

  1. 如何在Word中的表上添加边框或更改边框
  2. 必须了解的待人处事小技巧
  3. 基于Java+控制台实现车辆信息管理系统
  4. 手机连接投影机的步骤_苹果手机如何连投影仪_苹果手机与投影仪连接的方法教程(步骤)...
  5. HCI实验spss数据分析
  6. 剑指offer之简单题(三)
  7. XCTF mobile新手区解题记录(WP)以及一些总结和思考
  8. php生成word文件
  9. 移植 u-boot-2020.07 到 iTOP-4412(二)地址相关码 boot
  10. 滚动轴承频谱分析详解