需求:存在左图销量表,要得到右边的保有量表,保有量等于前12月销量和。

销量

保有量

2010

1

4

2010

1

4

2010

2

4

2010

2

8

2010

3

4

2010

3

16

2010

4

4

2010

4

20

2010

5

4

2010

5

24

2010

6

4

2010

6

28

2010

7

4

2010

7

32

2010

8

4

2010

8

36

2010

9

4

2010

9

40

2010

10

4

2010

10

44

2010

11

4

2010

11

48

2010

12

4

2010

12

52

2011

1

4

2011

1

52

2011

2

4

2011

2

52

2011

3

4

2011

3

52

2011

4

4

2011

4

52

2011

5

4

2011

5

52

2011

6

4

2011

6

52

解答:创建例表,便于测试

create table tsales(y,m,n)--年,月,销量

as select  2010,  1,  4 from dual union all

select  2010,  2,  4 from dual union all

select  2010,  3,  4 from dual union all

select  2010,  4,  4 from dual union all

select  2010,  5,  4 from dual union all

select  2010,  6,  4 from dual union all

select  2010,  7,  4 from dual union all

select  2010,  8,  4 from dual union all

select  2010,  9,  4 from dual union all

select  2010,  10,  4 from dual union all

select  2010,  11,  4 from dual union all

select 2010, 12, 4 from dual union all

select  2011,  1,  4 from dual union all

select  2011,  2,  4 from dual union all

select  2011,  3,  4 from dual union all

select  2011,  4,  4 from dual union all

select  2011,  5,  4 from dual union all

select 2011, 6, 4 from dual

--计算保有量(保有量等于前12个月内的销量和)

select t1.*,(select sum(t2.n)

from tsales t2

where (t2.y = t1.y and t2.m <= t1.m)

or (t2.y = t1.y - 1 and t2.m > t1.m)

) as 保有量 from tsales t1

--利用分析函数也可以:

--方法一

select y,m,n,n+LAG(n,11,0)over(order by y,m)+LAG(n,10,0)over(order by y,m)+LAG(n,9,0)over(order by y,m)+

LAG(n,8,0)over(order by y,m)+LAG(n,7,0)over(order by y,m)+LAG(n,6,0)over(order by y,m)+

LAG(n,5,0)over(order by y,m)+LAG(n,4,0)over(order by y,m)+LAG(n,3,0)over(order by y,m)+

LAG(n,2,0)over(order by y,m)+LAG(n,1,0)over(order by y,m) as 保有量from tsales

--方法二

SELECT y,m,n,SUM(n)over(order by y,m rows between 11 preceding and 0 following) QTY

FROM tsales

以上两个分析函数的使用存在错误,保有量的计算是按钮年月前推12个月(即一年内),实际业务中不能保证每个月都有数据(即每个月都有销量),如果我们能确保表中每个月都有销量的话(或将缺省的月份构造成0销量也可)上述两个分析函数的方法可以使用。使用range窗体子句才是正解,如下:

SELECT y,m,n,SUM(n)over(order by y,mrange between 11 preceding and 0 following) QTY.

FROM tsales

分析函数中窗口子句rows和range的区别就是前者以记录数分窗,后者以字段值分窗;

oracle语句求保有率,Oracle之保有量计算(当前记录等于前几条记录之和)相关推荐

  1. oracle数据库中求某行的上一条记录和下一条记录

    利用oracle提供的lead.lag  函数来查询已有记录的上一条.下一条记录. 求id=ae2e829ecffd4715a5c163f829c2e0f5的上一条记录和下一条记录 上一条记录的sql ...

  2. 不同数据库中查询前几条记录的用法(SQL Server/Oracle/Postgresql)

    SQL在不同数据库中查询前几条记录的用法分类 1. orACLE Select * FROM TABLE1 Where ROWNUM<=N 2. INFORMIX Select FIRST N ...

  3. oracle中取最新的前几条记录(rownum)

    对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀. ...

  4. oracle 取前10条记录

    1.oracle 取前10条记录 1) select * from tbname where rownum < 11; 2) select * from (select * from tbnam ...

  5. SQL查询前10条记录(SqlServer/mysql/oracle)[语法分析]

    Sql Server : Sql代码 select top X * from table_name --查询前X条记录,可以改成需要的数字. select top n * from (select t ...

  6. oracle查询最高一条记录,oracle 查询已有记录,上一条记录,下一条记录

    oracle可以使用 lead.lag  函数来查询已有记录的下一条.上一条记录. 表结构如下: 如要查询Staffno是6-1102的前一条记录 select * from staff where ...

  7. oracle以10个记录为一页查询,SQL查询前10条记录(SqlServermysqloracle)语法分析

    SQL查询前10条记录(SqlServer/mysql/oracle)语法分析 Sql Server : Sql代码 select top X * from table_name --查询前X条记录, ...

  8. 数据库读取前几条记录的SQL语句大全

    1. Oracle数据库 SELECT * FROM TABLENAME WHERE ROWNUM <= N 2. Infomix数据库 SELECT FIRST N * FROM TABLEN ...

  9. 【SQL开发实战技巧】系列(十七):数据仓库中时间类型操作(初级)确定两个日期之间的工作天数、计算—年中周内各日期出现次数、确定当前记录和下一条记录之间相差的天数

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

最新文章

  1. Linux下实现USB口的热插拔
  2. 完整叙述html的语法结构,html article介绍与语法结构
  3. unsigned a:1;
  4. java arraylist排序_最全Java集合笔记
  5. 【Python基础入门系列】第04天:Python 流程控制
  6. python调用接口测试_Python接口测试实战2 - 使用Python发送请求
  7. java3D反恐精英3_统一5.3.0f4错误CS0029;不能隐式转换'UnityEngine.Vector3'类型为'float'...
  8. 吴恩达机器学习(二)多元线性回归(假设、代价、梯度、特征缩放、多项式)
  9. 【转】java关键字final ,抽象类、接口介绍
  10. Java 集合中的快速失败(fail-fast)和安全失败(fail-safe)机制
  11. 科技信息它们叫嚣:没有我们,谈什么iPhone8!
  12. geoserver样式(SLD方式)—— 图层元素在不同比例尺显示不同样式
  13. android导航功能介绍,百度导航功能介绍
  14. Kubernetes 污点与容忍
  15. android实现b站弹幕,Android弹幕实现:基于B站弹幕开源系统(2)
  16. 易基因:PIWI/piRNA在人癌症中的表观遗传调控机制(DNA甲基化+m6A+组蛋白修饰)|综述
  17. bacnet协议--BAC0使用
  18. JSONPath 解析 JSON 内容详解(自 github)
  19. vcf无法导入iCloud 通讯录
  20. SystemUI setSystemUiVisibility参数属性

热门文章

  1. 内存泄漏的原因及解决办法_编程基础 | C++片段 指针、多态和内存分配
  2. @Url cannot be used with @GET URL (parameter #1)
  3. java线程不执行_java线程池,阿里为什么不允许使用Executors?
  4. php switch 函数,php switch case用法与实例教程
  5. rpm mysql 指定目录_rpm 安装并配置MySQL(包含指定数据存储路径)
  6. ios中的视频采集及参数设置和相机操作
  7. 计算结构体、数组、指针的sizeof
  8. Netty学习四:Channel
  9. sulime text 常用快捷键总结
  10. java删除文件夹的所有文件