SQL语句更新一个表的上下行的问题(急)

hhhaaa 2006-12-13 06:51:59
一个表如下:
日初始数(S) 日入数(R) 日出数(C) 日存量(ZL)
0 3 2
5 1
3 2
..........
能不能用精简的SQL语句将表的 S 列 与 ZL列填上值 结果为

日初始数(S) 日入数(R) 日出数(C) 日存量(ZL)
0 3 2 1
1 5 1 5
5 3 2 6
..........

即 zl =s+ r-c
S 为上一天的存量



...全文
359 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hmzgz81 2006-12-16
  • 打赏
  • 举报
回复
不知道楼主的表是这么生成出来的;

说说你为什么要这样做,大家才能帮你想想有没有更好的方案。
火龙岛主 2006-12-16
  • 打赏
  • 举报
回复
借用一下
?

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TStockDaily]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TStockDaily]
GO

CREATE TABLE [dbo].[TStockDaily] (
[OID] [int] IDENTITY (1, 1) NOT NULL ,
[S] [int] NULL ,
[R] [int] NULL ,
[C] [int] NULL ,
[ZL] [int] NULL
) ON [PRIMARY]
GO

Insert TStockDaily(R, C) Values(3, 2)
Insert TStockDaily(R, C) Values(5, 1)
Insert TStockDaily(R, C) Values(2, 0)
Insert TStockDaily(R, C) Values(7, 4)
Insert TStockDaily(R, C) Values(9, 4)

select 0 s,r,c,r-c zl
from tstockdaily a
where not exists(select 1 from tstockdaily b where a.oid>b.oid)
union
select sum(a.s)+sum(b.r)-sum(b.c) s,sum(a.r) r,sum(a.c),sum(a.s)+sum(b.r)-sum(b.c)+sum(a.r)-sum(a.c) zl
from tstockdaily a,tstockdaily b
where a.oid>b.oid
group by a.oid

没有测试,大致思路就是这样。你可以把结果存储在一张表中。
hmzgz81 2006-12-16
  • 打赏
  • 举报
回复

在保存 “日入数” 数据时,利用触发器,取出上一天的剩余量,同时计算出今天的剩余量,保存。
jianke5555 2006-12-16
  • 打赏
  • 举报
回复
用游标也是可以的.一条一条的更新!
jianke5555 2006-12-16
  • 打赏
  • 举报
回复
這是個日結報表,象月結報表一樣!!
hhhaaa 2006-12-16
  • 打赏
  • 举报
回复
一个库存统计表,要按日统计入、出、存量,与每日的初始量
hhhaaa 2006-12-13
  • 打赏
  • 举报
回复
谢谢各位大侠

有没有更更简洁一点的方法
柯本 2006-12-13
  • 打赏
  • 举报
回复
做肯定是可以的,但速度要看你的硬件了(执行几万次Update,估计要一段时间)
不管用SQL还是在程序中更新,每条记录必须有一个ID(前者要连续,后者不必),要提高速度,设该ID为主键(或对它建索引)
hhhaaa 2006-12-13
  • 打赏
  • 举报
回复
我的这个表有几万条记录
那行不行
柯本 2006-12-13
  • 打赏
  • 举报
回复
老冯的sql功低的确可以,但上面的有2个问题
1.数据表中必须有唯一且连续的OID
2.该sql只能用于sqlserver.其它数据库有问题
另外.要"多少记录 就执行多少次Update 语句",首先还是要在程序中取得数据行数
如果是这样,还不如在程序中实现,效率要高于上面的SQL,执行同样多的update.不用子查询,只要用变量就可以了
(关键是楼主的表结构的问题)
老冯 2006-12-13
  • 打赏
  • 举报
回复
有多少记录 就执行多少次Update 语句
老冯 2006-12-13
  • 打赏
  • 举报
回复
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TStockDaily]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TStockDaily]
GO

CREATE TABLE [dbo].[TStockDaily] (
[OID] [int] IDENTITY (1, 1) NOT NULL ,
[S] [int] NULL ,
[R] [int] NULL ,
[C] [int] NULL ,
[ZL] [int] NULL
) ON [PRIMARY]
GO

Insert TStockDaily(R, C) Values(3, 2)
Insert TStockDaily(R, C) Values(5, 1)
Insert TStockDaily(R, C) Values(2, 0)
Insert TStockDaily(R, C) Values(7, 4)
Insert TStockDaily(R, C) Values(9, 4)

Update TStockDaily Set S = (Case When (Select Sum(ZL) From TStockDaily Where OID = A.OID -1) Is Null Then 0 Else (Select Sum(ZL) From TStockDaily Where OID = A.OID -1) End),
ZL = (Case When (Select Sum(ZL) From TStockDaily Where OID = A.OID -1) Is Null Then 0 Else (Select Sum(ZL) From TStockDaily Where OID = A.OID -1) End) + R - C
From TStockDaily A


Select * From TStockDaily


---------------------------结果

OID S R C ZL
----------- ----------- ----------- ----------- -----------
1 0 3 2 1
2 1 5 1 5
3 5 2 0 7
4 7 7 4 10
5 10 9 4 15

(所影响的行数为 5 行)
hhhaaa 2006-12-13
  • 打赏
  • 举报
回复
那谢了
老冯 2006-12-13
  • 打赏
  • 举报
回复
可以的.老冯来帮助搞定
hhhaaa 2006-12-13
  • 打赏
  • 举报
回复
怎没人回答

2,497

社区成员

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

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