一个表如下:
日初始数(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 为上一天的存量
日初始数(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 为上一天的存量
drop table [dbo].[TStockDaily]
GOCREATE TABLE [dbo].[TStockDaily] (
[OID] [int] IDENTITY (1, 1) NOT NULL ,
[S] [int] NULL ,
[R] [int] NULL ,
[C] [int] NULL ,
[ZL] [int] NULL
) ON [PRIMARY]
GOInsert 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 行)
1.数据表中必须有唯一且连续的OID
2.该sql只能用于sqlserver.其它数据库有问题
另外.要"多少记录 就执行多少次Update 语句",首先还是要在程序中取得数据行数
如果是这样,还不如在程序中实现,效率要高于上面的SQL,执行同样多的update.不用子查询,只要用变量就可以了
(关键是楼主的表结构的问题)
不管用SQL还是在程序中更新,每条记录必须有一个ID(前者要连续,后者不必),要提高速度,设该ID为主键(或对它建索引)
? if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TStockDaily]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TStockDaily]
GOCREATE TABLE [dbo].[TStockDaily] (
[OID] [int] IDENTITY (1, 1) NOT NULL ,
[S] [int] NULL ,
[R] [int] NULL ,
[C] [int] NULL ,
[ZL] [int] NULL
) ON [PRIMARY]
GOInsert 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没有测试,大致思路就是这样。你可以把结果存储在一张表中。