在Oracle8i,如何用SQL语句实现:查询某字段的下一行记录值减上一行记录值的差?
如有表如下:
单位编号 收入
````````````````````````````````
001 5000
002 6000
003 5600
...想得到如下:
单位编号 差
````````````````````````````````
001 5000 //头行记录为原值
002 1000 //6000-5000=1000
003 -400 //5600-6000=-400
...用PL SQL、游标逐行处理可以,现在想用SQL语句实现,该怎么办?
求高手不吝赐教~!谢谢~
如有表如下:
单位编号 收入
````````````````````````````````
001 5000
002 6000
003 5600
...想得到如下:
单位编号 差
````````````````````````````````
001 5000 //头行记录为原值
002 1000 //6000-5000=1000
003 -400 //5600-6000=-400
...用PL SQL、游标逐行处理可以,现在想用SQL语句实现,该怎么办?
求高手不吝赐教~!谢谢~
多定义一个参数,记下当前的值,下一行的时候再用当前值减刚才的值啊。
代码方面的参考联机帮助或者看SQL SERVER 技术内幕。应该不会难。
有什么具体的问题再问。
难道不能用SQL语句直接写出?
001 , 5000
002 , 6000
003 , 5600
...
在SQL server 2000中可用下面的方法实现:select a.class,a.price-isnull(b.price,0) as price from
(select *,class+0 as class1 from tab ) a left join
(select *, class+1 as class1 from tab where class<>( select max(class) from tab)) b
on a.class1=b.class1
得到结果:class, price
001 , 5000
002 , 1000
003 , -400
...
oracle中我就不清楚了.................:)
单位编号 char(10),
收入 decimal null
)insert into t
select '001', 5000
union
select '002', 6000
union
select '003', 5600select 单位编号,
差 = 收入 - IsNull((select top 1 收入 from t
where cast(单位编号 as int) < cast(a.单位编号 as int) order by cast(单位编号 as int) desc), 0)
from t a 测试结果:
001 5000
002 1000
003 -400
--try;select a.单位编号,a.收入-b.收入 差 from
(
select rownum no,单位编号,收入 from tb
) a,
(
select rownum no,单位编号,收入 from (select '000' 单位编号,0 收入 from dual union all
select 单位编号,收入 from tb)
) b
where a.no=b.no;
---------------------------------
在ORACLE的实现,谢谢大家~!