修改数据效率问题

shizhusz110 2008-09-27 09:35:56
本人菜鸟,自己不会来问
数据表:
--------------------------
日期,上期余额,现金1,现金2,本期余额 --:上期余额为该条数据上面的本期余额,该表按日期大小排序
-----------------------------
例如:
1)2008-9-25 00:00:00 ,0,12,12,24
2)2008-9-25 00:00:01 ,24,3,2,29
3)2008-9-25 00:01:00,29,4,-2,31
4)2008-9-25 01:00:00 ,31,2,2,35
5).....这里想这样排序可能有N<500000条
-------------------------------
但是这是用户将中间的记录修改了
例如:将2)修改为:
2)2008-9-25 00:00:01 ,24,4,2,30
后面页要依次类推的进行修改,为:
3)2008-9-25 00:01:00,30,4,-2,32
4)2008-9-25 01:00:00 ,32,2,2,36
............这是可能修改到完
我用游标,这样可能修改很多次?就很慢?大家能不能给个好的方法?使这样快点
谢谢大家回复!!!!!!!!!!!!!!!!!!!!!!!!
...全文
144 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 shizhusz110 的回复:]
谢谢回复!那上面的大哥们!
<1>那如果别人写改了多条数据:比如他修改了2,和10..那怎么办?????该方法能不能按日期最先修改的这样进行运算??
<2>我现在这个表里可能有多组这样的数据,例如在表里加个字段:类型
类型1,类型2,..
各类型里面的数据可能也是按这样的实际形式,该类型里面的可能被修改可能不被修改??怎么办?
-------------------
谢谢大家!今天可能脸皮太厚了!由于处理数据太多自己!自己太菜!!所以想找个好点的…
[/Quote]我的语句就是按日期+时间的顺序来的.
shizhusz110 2008-09-27
  • 打赏
  • 举报
回复
谢谢回复!那上面的大哥们!
<1>那如果别人写改了多条数据:比如他修改了2,和10..那怎么办?????该方法能不能按日期最先修改的这样进行运算??
<2>我现在这个表里可能有多组这样的数据,例如在表里加个字段:类型
类型1,类型2,..
各类型里面的数据可能也是按这样的实际形式,该类型里面的可能被修改可能不被修改??怎么办?
-------------------
谢谢大家!今天可能脸皮太厚了!由于处理数据太多自己!自己太菜!!所以想找个好点的方法!
jiang5311 2008-09-27
  • 打赏
  • 举报
回复
经常来CSDN看贴回贴,水平一定能提高!
还有最重要的一条,就是多在实际工作中练习!!!
Sniper_Killer 2008-09-27
  • 打赏
  • 举报
回复
。。
Garnett_KG 2008-09-27
  • 打赏
  • 举报
回复

--试一下这种.
DECLARE @t TABLE(Dt DateTime Primary Key,PreAmt INT,Amt1 INt,Amt2 INT,TotalAmt INT)

INSERT INTO @t
SELECT
'2008-9-25 00:00:00' ,0,12,12,24 UNION ALL SELECT
'2008-9-25 00:00:01' ,24,3,2,29 UNION ALL SELECT
'2008-9-25 00:01:00',29,4,-2,31 UNION ALL SELECT
'2008-9-25 01:00:00' ,31,2,2,35

DECLARE @FixDate DATETIME --修改的日期
DECLARE @PreAmt INT,
@TotalAmt INT
SET @FixDate='2008-9-25 00:00:01'
select * from @t
UPDATE @t SET Amt1=7 WHERE Dt=@FixDate

UPDATE @t
SET @PreAmt=IsNULL(@PreAmt,PreAmt)+Amt1+Amt2,
TotalAmt=@PreAmt,
PreAmt=@PreAmt-Amt1-Amt2
WHERE dt>=@FixDate

SELECT * FROM @t

/*
--修改前
Dt PreAmt Amt1 Amt2 TotalAmt
------------------------------------------------------ ----------- ----------- ----------- -----------
2008-09-25 00:00:00.000 0 12 12 24
2008-09-25 00:00:01.000 24 3 2 29
2008-09-25 00:01:00.000 29 4 -2 31
2008-09-25 01:00:00.000 31 2 2 35

--修改後
Dt PreAmt Amt1 Amt2 TotalAmt
------------------------------------------------------ ----------- ----------- ----------- -----------
2008-09-25 00:00:00.000 0 12 12 24
2008-09-25 00:00:01.000 24 7 2 33
2008-09-25 00:01:00.000 33 4 -2 35
2008-09-25 01:00:00.000 35 2 2 39
*/
shizhusz110 2008-09-27
  • 打赏
  • 举报
回复
自己太笨!怎么提高自己呢?问下前辈们??回答后结贴!!!十分谢谢大家
dawugui 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shizhusz110 的回复:]
@dawgui 想你那样update怎么做??本人实在太菜,我打算用将select修改成update不行
[/Quote]
create table tb (日期 datetime,上期余额 int,现金1 int,现金2 int,本期余额 int)
insert into tb values('2008-9-25 00:00:00' ,0,12,12,24)
insert into tb values('2008-9-25 00:00:01' ,24,3,2,29 )
insert into tb values('2008-9-25 00:01:00' ,29,4,-2,31)
insert into tb values('2008-9-25 01:00:00' ,31,2,2,35)
go
--原始数据
select * from tb
/*

日期 上期余额 现金1 现金2 本期余额
------------------------------------------------------ ----------- ----------- ----------- -----------
2008-09-25 00:00:00.000 0 12 12 24
2008-09-25 00:00:01.000 24 3 2 29
2008-09-25 00:01:00.000 29 4 -2 31
2008-09-25 01:00:00.000 31 2 2 35

(所影响的行数为 4 行)
*/


--例如:将2)修改为: 2)2008-9-25 00:00:01 ,24,4,2,30
update tb set 现金1 = 4 where 日期 = '2008-9-25 00:00:01'

--修改其他数据
update tb
set 上期余额 =
isnull((select sum(现金1) from tb where 日期 < t.日期),0) +
isnull((select sum(现金2) from tb where 日期 < t.日期),0) ,
本期余额 =
isnull((select sum(现金1) from tb where 日期 <= t.日期),0) +
isnull((select sum(现金2) from tb where 日期 <= t.日期),0)
from tb t

--查询修改后的数据
select * from tb

/*
日期 上期余额 现金1 现金2 本期余额
------------------------------------------------------ ----------- ----------- ----------- -----------
2008-09-25 00:00:00.000 0 12 12 24
2008-09-25 00:00:01.000 24 4 2 30
2008-09-25 00:01:00.000 30 4 -2 32
2008-09-25 01:00:00.000 32 2 2 36

(所影响的行数为 4 行)
*/

drop table tb
tim_spac 2008-09-27
  • 打赏
  • 举报
回复
update tb set
上期余额 =
isnull((select sum(现金1) from tb where 日期 < t.日期),0) +
isnull((select sum(现金2) from tb where 日期 < t.日期),0) ,
本期余额 =
isnull((select sum(现金1) from tb where 日期 <= t.日期),0) +
isnull((select sum(现金2) from tb where 日期 <= t.日期),0)
from tb t
shizhusz110 2008-09-27
  • 打赏
  • 举报
回复
@dawgui 想你那样update怎么做??本人实在太菜,我打算用将select修改成update不行
shizhusz110 2008-09-27
  • 打赏
  • 举报
回复
谢谢上面的回答!!看来自己要努力学习!!十分感谢!!!还有没好的!!!
dawugui 2008-09-27
  • 打赏
  • 举报
回复
create table tb (日期 datetime,上期余额 int,现金1 int,现金2 int,本期余额 int)
insert into tb values('2008-9-25 00:00:00' ,0,12,12,24)
insert into tb values('2008-9-25 00:00:01' ,24,3,2,29 )
insert into tb values('2008-9-25 00:01:00' ,29,4,-2,31)
insert into tb values('2008-9-25 01:00:00' ,31,2,2,35)
go
--原始数据
select * from tb
/*

日期 上期余额 现金1 现金2 本期余额
------------------------------------------------------ ----------- ----------- ----------- -----------
2008-09-25 00:00:00.000 0 12 12 24
2008-09-25 00:00:01.000 24 3 2 29
2008-09-25 00:01:00.000 29 4 -2 31
2008-09-25 01:00:00.000 31 2 2 35

(所影响的行数为 4 行)
*/


--例如:将2)修改为: 2)2008-9-25 00:00:01 ,24,4,2,30
update tb set 现金1 = 4 where 日期 = '2008-9-25 00:00:01'

select 日期 ,
上期余额 =
isnull((select sum(现金1) from tb where 日期 < t.日期),0) +
isnull((select sum(现金2) from tb where 日期 < t.日期),0) ,
现金1 ,
现金2 ,
本期余额 =
isnull((select sum(现金1) from tb where 日期 <= t.日期),0) +
isnull((select sum(现金2) from tb where 日期 <= t.日期),0)
from tb t
/*
日期 上期余额 现金1 现金2 本期余额
------------------------------------------------------ ----------- ----------- ----------- -----------
2008-09-25 00:00:00.000 0 12 12 24
2008-09-25 00:00:01.000 24 4 2 30
2008-09-25 00:01:00.000 30 4 -2 32
2008-09-25 01:00:00.000 32 2 2 36

(所影响的行数为 4 行)
*/

drop table tb
pt1314917 2008-09-27
  • 打赏
  • 举报
回复


--先更改本条,
update tb set 现金1=现金1+1 where id=2
--更改以后
update b set 上期余额=上期余额+1 from tb a,tb b
where a.id=2 and b.日期,>a.日期
csdyyr 2008-09-27
  • 打赏
  • 举报
回复

update tb set 本期余额=本期余额+1,现金1=现金1+1
where 日期>所修改紀錄的日期
pl_mm 2008-09-27
  • 打赏
  • 举报
回复
俺也很菜 帮顶
酋长 2008-09-27
  • 打赏
  • 举报
回复
2.写错了,应该是等于当前年度、大于当前期间的期初余额、期末余额
酋长 2008-09-27
  • 打赏
  • 举报
回复
这个是典型的ERP系统的财务会计记账实例。

1.更新当前年度、当前期间的借方或者贷方,同时更新响应的余额

2.更新大于当前年度、当前期间的期初余额、期末余额

3.更新大于当前年度的期初余额、期末余额

通过update语句就可以实现,没有必要用游标,否则性能极差。

34,597

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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