一个表如下:
日初始数(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 为上一天的存量
    

解决方案 »

  1.   

    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)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 行)
      

  2.   

    有多少记录 就执行多少次Update 语句
      

  3.   

    老冯的sql功低的确可以,但上面的有2个问题
    1.数据表中必须有唯一且连续的OID
    2.该sql只能用于sqlserver.其它数据库有问题
    另外.要"多少记录 就执行多少次Update 语句",首先还是要在程序中取得数据行数
    如果是这样,还不如在程序中实现,效率要高于上面的SQL,执行同样多的update.不用子查询,只要用变量就可以了
    (关键是楼主的表结构的问题)
      

  4.   

    做肯定是可以的,但速度要看你的硬件了(执行几万次Update,估计要一段时间)
    不管用SQL还是在程序中更新,每条记录必须有一个ID(前者要连续,后者不必),要提高速度,设该ID为主键(或对它建索引)
      

  5.   

    借用一下
    ?  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没有测试,大致思路就是这样。你可以把结果存储在一张表中。