如何用SQL语句实现:查询某字段的下一行记录值减上一行记录值的差?

时间:2023-01-09 15:35:56
在Oracle8i,如何用SQL语句实现:查询某字段的下一行记录值减上一行记录值的差?
如有表如下:
   单位编号        收入
````````````````````````````````
   001             5000
   002             6000
   003             5600
   ...

想得到如下:
  单位编号         差         
````````````````````````````````
   001             5000    //头行记录为原值
   002             1000    //6000-5000=1000
   003             -400    //5600-6000=-400
   ...

用PL SQL、游标逐行处理可以,现在想用SQL语句实现,该怎么办?
求高手不吝赐教~!谢谢~

9 个解决方案

#1


Oracle8i不熟悉

#2


哦,楼上的高手,如果是在SQL SERVER2000中呢?谢谢~!

#3


用游标啊。
多定义一个参数,记下当前的值,下一行的时候再用当前值减刚才的值啊。
代码方面的参考联机帮助或者看SQL SERVER 技术内幕。应该不会难。
有什么具体的问题再问。

#4


噢,用游标的话我也是晓得的;
难道不能用SQL语句直接写出?

#5


使用SELECT递归语句撒

#6


表tab的数据

class, price
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中我就不清楚了.................:)

#7


create table t(
       单位编号  char(10),
       收入  decimal null
)

insert into t
select '001',             5000
union
select '002',             6000
union
select '003',             5600

select 单位编号,  
差 = 收入 - 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

#8


设一个自增字段,根据这个字段做会简单些

#9


ORARichard(没钱的日子......) ( ) 信誉:100  2005-1-21 12:16:50  得分: 0  
 
 
   
--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的实现,谢谢大家~!

#1


Oracle8i不熟悉

#2


哦,楼上的高手,如果是在SQL SERVER2000中呢?谢谢~!

#3


用游标啊。
多定义一个参数,记下当前的值,下一行的时候再用当前值减刚才的值啊。
代码方面的参考联机帮助或者看SQL SERVER 技术内幕。应该不会难。
有什么具体的问题再问。

#4


噢,用游标的话我也是晓得的;
难道不能用SQL语句直接写出?

#5


使用SELECT递归语句撒

#6


表tab的数据

class, price
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中我就不清楚了.................:)

#7


create table t(
       单位编号  char(10),
       收入  decimal null
)

insert into t
select '001',             5000
union
select '002',             6000
union
select '003',             5600

select 单位编号,  
差 = 收入 - 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

#8


设一个自增字段,根据这个字段做会简单些

#9


ORARichard(没钱的日子......) ( ) 信誉:100  2005-1-21 12:16:50  得分: 0  
 
 
   
--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的实现,谢谢大家~!