类似Excel的功能
序 长度 累计
1 100 100
2 130 230
3 160 390
4 110 500
5 190 590
6 125 715
...
...
上表中累计为计算字段,不知各位前辈有什么好办法?
序 长度 累计
1 100 100
2 130 230
3 160 390
4 110 500
5 190 590
6 125 715
...
...
上表中累计为计算字段,不知各位前辈有什么好办法?
解决方案 »
- 汉字排序的问题
- 使用odac时将net打为true,连接数据库时报错:service unvavilable!如何这是什么原因啊?
- 问个很白痴的问题 SQL语句在Delphi中就直接用吗?
- 我找到了在delphi中多显示器编程的函数和使用的方法了!
- 绘制正弦曲线!请各位大哥帮忙!
- 关于登录的做法?
- delphi7如何给excel单元格设置超链接地址
- 急:!!(求救)请问有谁知道DOS模式下的文件的快捷方式(*.PIF)文件的格式吗请帮忙谢谢。
- ActiveForm分发后运行HTM,看到的是“Delphi 5 ActiveX Test Page ”,可我的页面哪去了?
- 解释下这三行代码的含义;
- 帮忙看下这段语句怎么改
- adoquery+dbgrid装箱的问题,插入另外一张表
在计算字段中每次都要做累加,把ID<=当前值的长度全都累计一下
不过在记录多的情况下,效率可想而知。
为什么不用SQL语句呢
declare @t table(id int,length int)
insert @t select 1,10
union all select 2,30
union all select 3,40
union all select 4,70
union all select 5,90select
id,
length,
AccValue=(select sum(length) from @t where id<=a.id)
from @t a
用SQL Code测试调用10000条记录大约用了25秒(用双核笔记本测试),觉得还是太慢了,客户是不会接受的。另外,在客户端更改了数据不能即时更新后面的记录。
不知Execl是用了什么技术,随便更改一行记录,汇总随即更新。
declare @ALength Int --长度变量
declare @a table(长度 int,统计 int) --定义临时表
declare cur1 cursor --定义游标
for select 长度 from Table1 --提取记录Set @total=0.0
open cur1 --打开游标
fetch next from cur1 INTO @ALength --进行循环处理
while (@@fetch_status=0 )
begin
set @Total=@Total+@ALength --累加
insert into @a(长度,统计) values(@ALength,@total) --插入到临时表中
fetch next from cur1 INTO @ALength --处理下一条记录
end;select * from @a --显示结果
close cur1 --关闭游标
deallocate cur1 --删除游标可以定义成存储过程,在程序中调用。
经测试,11000条记录,1S时间
欢迎支持:
http://bbs.yd153.com
declare @t table(id int,length int, AccValue int)
insert @t(id,length)
select 1,10
union all select 2,30
union all select 3,40
union all select 4,70
union all select 5,90--更新未加累积值的行
declare @i int,@MaxID int
select @i = 1
select @MaxID = max(id) from @t
while @i <= @MaxID
begin
update a set a.AccValue = a.length + isnull(b.AccValue,0)
from @t a left join @t b on a.id = b.id + 1
where a.id = @i
set @i = @i + 1
end;/*
--建议LZ加一个触发器,在插入或更新时做以下操作
declare @iValueOrg int --记录用户修改前的值
declare @iValueMod int --记录用户修改后的值
declare @ID int --进行更新的记录ID
update @t set AccValue = AccValue + @iValueMod - @iValueOrg
where a.id <= @ID
*/
该问题的核心在于如何不重复累计已统计的信息。
解决方法为:
为已参与统计的数据加上处理标识。如果在10000中加上一条记录,那直接就以最后的值+新增记录。
如果在已有的记录中做修改,则直接在累计字段+增量。
如果不这样处理,再好的SQL语句,再优秀的表设计也枉然
其实这个问题是用在一个生产现场按制软件,上表中‘序’为每张订单的生产顺序号,‘长度’为每张订单的剩余长度,在实际生产中必须一张一张订单的生产,因此第一张订单的‘长度’是会随着生产的进行不断的改变(减少)(车速约300m/min),相应的每张订单累计长度也会改变(我们需要用这个长度来预估生产时间)。同时,为了满足生产的需要,在生产中会出现以下情况:更改生产顺序、插单、删单。
多数朋友趋向用SQL解决,但我担心这么高频率的更新服务器是否能够应付?我们有看过台湾同行的系统,第一他们没有用类似SQL的数据库(数据好象存在*.dat文件),第二电脑就是普通的PC,第三功能完全实现。但在运行他们的系统时,CPU使用率几乎100%。
不知各位是否还有其它好建议?