一个表如下:
日初始数(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 为上一天的存量
解决方案 »
- apro控件是不是现在不行了
- 1分钟精通所有编程(现在就指望这个吃饭了,一般人我不告诉他)
- 请问TIdUdpClient如何接收TIdUdpServer发送来的数据
- 诚心求购《delphi 6 开发人员指南》
- 怎么样让DBLookupComboBox1 过滤 DBLookupComboBox2 的内容!
- 两问题,1、为啥count(band1)出来为1?2、当字段很多时,怎么让它一页打印(不跳到另外的页)
- 关于DBGRIDEH控件的一个问题?
- 打印时间遇到的问题,大家赶赶紧帮忙呀。
- 如何编写类似Treeview结构的目录选取对话框,或者有这方面的VCL吗?份是不多,望大哥赐教
- 我的DELPHI程序为何打不出来?
- 求教棒图
- 有什么简单的方法能获得listview的选中行数和总行数?
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没有测试,大致思路就是这样。你可以把结果存储在一张表中。