SQL计算问题,大家来看看,急死了

huangjinyin 2006-11-10 02:36:45
有一表如下
科目 方向 借方 贷方 余额
1001 0 0 0 3500(是现成数据)第一行
1001 0 500 0 4000(4000要通过计算的)第二行
1001 0 300 0 4300(4300要通过计算的)第三行
1001 1 0 1000 3300(3300要通过计算的)第四行

这里边的余额就第一条是现成数据
下面的都是要经过计算得出来的,公式如下

if(方向==0) 第二行的余额=第一行余额+第二行借方-第二行货方
if(方向==1) 第二行的余额=第一行余额-第二行借方+第二行货方

除了用游标外还能用什么实现(数据量大时游标太慢)
...全文
162 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
N_chow 2006-11-10
  • 打赏
  • 举报
回复
--示数资料
--楼主的资料有误,按你的公式算,最后一行应该是5300,而不是3300,
--我套你的公式,只不过把1000填到了借方上
--
Declare @rs table (科目 nvarchar(10),方向 bit,借方 int,贷方 int,金额 int)
INSERT INTO @rs values ('1001',0,0,0,3500)
INSERT INTO @rs values ('1001',0,500,0,NULL)
INSERT INTO @rs values ('1001',0,300,0,NULL)
INSERT INTO @rs values ('1001',1,1000,0,NULL)
INSERT INTO @rs values ('1002',0,0,0,500)
INSERT INTO @rs values ('1002',0,580,0,NULL)

DECLARE @SbjCode nvarchar(20)
DECLARE @i INT
DECLARE @Ac INT

select * from @rs --更新之前

UPDATE @rs
SET @i=@i+1,
@SbjCode=@SbjCode+科目,
@Ac=金额=CASE WHEN 科目=LEFT(@SbjCode,LEN(@SbjCode)/@i) THEN
CASE WHEN 方向=0 THEN @Ac+借方-贷方 ELSE @Ac-借方+贷方 END
ELSE 金额
END,
@i=CASE WHEN 科目=LEFT(@SbjCode,LEN(@SbjCode)/@i) THEN @i ELSE 1 END,
@SbjCode=科目,
@i=CASE WHEN @i=2 THEN (CASE WHEN @SbjCode=科目 THEN 1 ELSE @i END) ELSE @i END

---更新之后
SELECT * FROM @rs

playwarcraft 2006-11-10
  • 打赏
  • 举报
回复
按我的理解如果不想用游標,就最後建個臨時表,加上id標示列

select id=identity(int,1,1),* into #t from T

update #t
set 余额=(select max(余额) from T where T.科目=#t.科目)
+(select sum(case when 方向=0 then 借方-贷方 else 贷方-借方 end) from #t a where a.id<=#t.id and a.科目=#t.科目)

truncate table T
insert into T select 科目,方向,借方, 贷方, 余额 from #t
leaohong 2006-11-10
  • 打赏
  • 举报
回复
几个问题
1 公式错了吧,所谓后面的方向只是说明借贷关系吧,0为借,1为贷,余额是初期余额+本期借-本期贷吧
2 不明白LZ的需求,如果是为了插入记录跟修改,不用游标的话可以用SP。如果是统计,那写入数据库的时候为什么不先算余额
playwarcraft 2006-11-10
  • 打赏
  • 举报
回复
1001 0 300 0 4300(4300要通过计算的)第三行
1001 1 0 1000 3300(3300要通过计算的)第四行
--------
1001 1 0 1000 3300(3300要通过计算的)第四行
这个是用第三行的余额来算的
if(方向==0) 第二行的余额=第一行余额+第二行借方-第二行货方
if(方向==1) 第二行的余额=第一行余额-第二行借方+第二行货方

--------------------------------------
根據公式 方向=1 ,所以4300-0+1000=5300 ????
早起晚睡 2006-11-10
  • 打赏
  • 举报
回复
我感觉你的还是用游标比较好 如果你想用其它的方法你还是到SQL版去那里的大版主很厉害的应该能给你解决的。
tianzhenjing 2006-11-10
  • 打赏
  • 举报
回复
直接 用select就ok

case 方向 when 0 then 第一行余额+第二行借方-第二行货方
else 第一行余额-第二行借方+第二行货方
end as 余额
huangjinyin 2006-11-10
  • 打赏
  • 举报
回复
1001 1 0 1000 3300(3300要通过计算的)第四行
这个是用第三行的余额来算的
huangjinyin 2006-11-10
  • 打赏
  • 举报
回复
科目会变的
早起晚睡 2006-11-10
  • 打赏
  • 举报
回复
科目是不变的吗?
早起晚睡 2006-11-10
  • 打赏
  • 举报
回复
1001 1 0 1000 3300(3300要通过计算的)第四行
这一行用你的公式也得不到啊
lizhizhe2000 2006-11-10
  • 打赏
  • 举报
回复
帮顶了!

110,525

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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