求sql语句,逐行想减的。

kuki84 2005-02-28 06:21:01
请问,如下表一到表二转换的语句怎么写

no val
1 19
2 37
3 43
4 98

到表二:

no val
1 0
2 18
3 6
4 55
...全文
312 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuki84 2005-03-03
  • 打赏
  • 举报
回复
解决,结帖。

topchaos: 信誉低不是不诚信扣的,是有一次倒分解闷被纠的,特此澄清,哈哈。
jinjazz 2005-03-01
  • 打赏
  • 举报
回复
--建立测试环境
Create Table 表(no integer,val integer)
--插入数据
insert into 表
select '1','19' union
select '2','37' union
select '3','43' union
select '4','98'
select * from 表
--测试语句
select top 1 no,0 from 表
union
select b.no,b.val-a.val from 表 a,表 b
where a.no=b.no-1

--删除测试环境
Drop Table 表
shotking 2005-03-01
  • 打赏
  • 举报
回复
sqlserver可以这样写:
select a.nol,a.val,a.val-isnull(b.val,a.val)
from test_01 a,test_01 b
where a.nol*=b.nol+1
得到的结果就是
nol val (No column name)
1 19 0
2 37 18
3 43 6
4 98 55
cdsgajxlp 2005-03-01
  • 打赏
  • 举报
回复
我认为楼主性欲很高,呵呵
老本 2005-03-01
  • 打赏
  • 举报
回复
楼主性欲太低,呵呵
DebugXP 2005-03-01
  • 打赏
  • 举报
回复
查询分析器输出结果:
no1 val 无列名
————————————
1 19 0
2 37 18
3 43 6
4 98 55
————————————

DebugXP 2005-03-01
  • 打赏
  • 举报
回复
写得比较粗糙,太晚了,困。

--创建函数得到val2
CREATE FUNCTION [dbo].[Fun_Test]
(
@intNo INT
)RETURNS INT
AS
BEGIN
declare @rtValue INT
select @rtValue = +(max(val)-min(val)) from (
Select top 2 val From table1 Where no1<=@intNo
order by no1 desc) a

Return (ISNULL(@rtValue,0))

END

go
--建测试表
Create Table table1(no1 int,val int)

go
--插入测试记录
Insert into table1 values (1,19)
Insert into table1 values (2,37)
Insert into table1 values (3,43)
Insert into table1 values (4,98)

go
--查询
select no1,val,dbo.Fun_Test(no1) from table1

go
--删除函数和测试表
Drop FUNCTION [dbo].[Fun_Test]
Drop Table table1
pchaos 2005-03-01
  • 打赏
  • 举报
回复
信誉太低
还是不要回答了
DebugXP 2005-03-01
  • 打赏
  • 举报
回复
用自定义函数可以实现。
kuki84 2005-02-28
  • 打赏
  • 举报
回复
以上的都通不过。我把问题描述详细一点,
在sql server中,就只有一张表 ,table1
内容
no val
1 19
2 37
3 43
4 98
用sql语句,能显示出
no val val2
1 19 0
2 37 18
3 43 6
4 98 55
的效果,没有第二张表,也不用修改原table1的值。
dezxp 2005-02-28
  • 打赏
  • 举报
回复
select t1.no, t1.var-isnull(t2.var,t1.var)
from t t1 left join t t2 on t1.no=t2.no+1
qybao 2005-02-28
  • 打赏
  • 举报
回复
have a try
select a.no, (b.val-a.val) as val
from your_table a,
your_table b
where b.no = a.no + 1
chinaandys 2005-02-28
  • 打赏
  • 举报
回复
上面的在SQL SERVER中可以测试
chinaandys 2005-02-28
  • 打赏
  • 举报
回复
再修改一下:
select *,val=val-isnull((select val from test where a.no>no),0) from test a
order by no



注意 : test换成表名
chinaandys 2005-02-28
  • 打赏
  • 举报
回复
select *,val=val-isnull((select max(val) from test where a.no>no),0) from test a



注意 : test换成表名
wlmhlg 2005-02-28
  • 打赏
  • 举报
回复
恩,的确。
lonaerd 2005-02-28
  • 打赏
  • 举报
回复
有更简单的方法:
no val
1 19
2 37
3 43
4 98

到表二:

no val tmp
1 19 19
2 37 19
3 43 37
4 98 43

一个循环中用一个变量就可得到tmp列的值,然后用update .... set val=val-tmp



wlmhlg 2005-02-28
  • 打赏
  • 举报
回复
你先设置3个变量,其中两个用来存取每次读取表一的前两行的。第3个用来存取他们的差的。
然后重首记录开始搜索,一直到末位记录。然后把第3个变量付值给表2中的val项,就搞定了

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧