功能是算余额.
现在有三个表,xjsk(现金收款),xjfk(现金付款),xjrjz(现金日记帐).现金收款里的"金额"(字段名)插到现金日记由的借方里,现金付款的"金额'插到现金日记帐的贷方里.在现金日记帐里有字段"余额".我需要在每一次现金收款和现金付款里有数据插入时,现金日记帐里的"余额"就进行自动计算.
我现在的想法是(先做现金收款):把现金日记帐的"借方','余额","日期","编号",插到一个临时表里面,并且新建一个自动编号的字段,可以对插入的数据排序后,进行自动编号(order by 日期).
问题一:问这个临时表的创建语句是什么.
问题二:在插入一个字段以后,"余额"如何进行计算.如果是在我只是修改某一个记录的话,那么之后的记录(余额)都要进行刷新,语句又是如何.
回答出来,分不够,另外开贴!
谢谢各位达人的帮助~~ 小M在这里拜谢各位了!!
现在有三个表,xjsk(现金收款),xjfk(现金付款),xjrjz(现金日记帐).现金收款里的"金额"(字段名)插到现金日记由的借方里,现金付款的"金额'插到现金日记帐的贷方里.在现金日记帐里有字段"余额".我需要在每一次现金收款和现金付款里有数据插入时,现金日记帐里的"余额"就进行自动计算.
我现在的想法是(先做现金收款):把现金日记帐的"借方','余额","日期","编号",插到一个临时表里面,并且新建一个自动编号的字段,可以对插入的数据排序后,进行自动编号(order by 日期).
问题一:问这个临时表的创建语句是什么.
问题二:在插入一个字段以后,"余额"如何进行计算.如果是在我只是修改某一个记录的话,那么之后的记录(余额)都要进行刷新,语句又是如何.
回答出来,分不够,另外开贴!
谢谢各位达人的帮助~~ 小M在这里拜谢各位了!!
select eid,state from istate
结果:
eid state
1 1
2 2
3 3
4 4
另外:
select i.eid,i.state,'余额'=(select sum(state) from istate where eid<=i.eid)
from istate i
结果:
eid state 余额
1 1 1
2 2 3
3 3 6
4 4 10把上面的语句建立一个视图即可。
on i2.eid<=i1.eid
group by i1.eid,i1.state
余额信息,应该是和账户、日期对应的,不知道你是采用什么方式来保存你的余额,
我认为有两种方式:
M1、根据每一笔发生额刷新你的余额信息,随时记录实时的余额。
M2、每日最后计算一次余额,第二天的发生额并不修改余额,需要余额信息的时候根据昨日余额和当前发生额来计算当前余额。
关于余额的考虑:
1、余额信息是很常用的数据,修改、查询都很频繁,如果采用试图的方式或者上面说的第一种方式(M1),或给数据库带来比较大的负担。
2、对昨日余额的查询也会比较频繁,所以可以考虑建立一张余额表,至于时间长度一般采用日,当然你可以自己作调整。
希望高人再指点。
,对象 varchar(10),金额 money,摘要 varchar(50),日期 datetime)
insert into @现金收款
select 'A项目','A对象',150,'收货款','2003-01-01'
union all select 'A项目','B对象',250,'收电费','2003-01-02'
union all select 'A项目','C对象',650,'收消费','2003-01-02'
union all select 'B项目','A对象',950,'收械','2003-01-02'
union all select 'B项目','C对象',1500,'魇','2003-01-03'declare @现金付款 table(编号 int identity(1,1),项目 varchar(10)
,对象 varchar(10),金额 money,摘要 varchar(50),日期 datetime)
insert into @现金付款
select 'A项目','A对象',1500,'aaa','2003-01-01'
union all select 'A项目','B对象',25,'bbb','2003-01-02'
union all select 'A项目','C对象',50,'ccc','2003-01-02'
union all select 'B项目','A对象',50,'ddd','2003-01-02'
union all select 'B项目','C对象',100,'eee','2003-01-03'select 项目=isnull(a.项目,b.项目)
,对象=isnull(a.对象,b.对象)
,借方=isnull(a.金额,0)
,贷方=isnull(b.金额,0)
,摘要=isnull(a.摘要,b.摘要)
,日期=isnull(a.日期,b.日期)
,余额=isnull(a.累计金额,0)-isnull(b.累计金额,0)
from(
select 项目,对象,金额=sum(金额)
,累计金额=(select sum(金额) from @现金收款
where 项目=a.项目 and 对象=a.对象 and 摘要=a.摘要
and 日期<=a.日期)
,摘要,日期
from @现金收款 a
group by 项目,对象,摘要,日期
)a full join(
select 项目,对象,金额=sum(金额)
,累计金额=(select sum(金额) from @现金付款
where 项目=a.项目 and 对象=a.对象 and 摘要=a.摘要
and 日期<=a.日期)
,摘要,日期
from @现金付款 a
group by 项目,对象,摘要,日期
)b on a.项目=b.项目 and a.对象=b.对象 and a.日期=b.日期
FOR insert,update
AS
insert into xjrjz('编号','借方','余额')
--values(identity(int,1,1),)
select ids=identity(int,1,1),借方,余额=余额+借方 from xjsk
create trigger triggername2 on xjzf
for insert,update
as
insert into xjrjz('编号','贷方','余额')
select ids,借方,余额=余额-贷方 from xjzf
select identity(int,1,1)as myid,编号,借方,贷方,余额,日期 into #linshi
from xjrjz order by 日期
update #linshi
set 余额=借方+
(select top 1 余额 from #linshi a
where a.myid<#linshi.myid
order by a.myid desc)
update xjrjz
set 余额=#linshi.余额
from xjrjz, #linshi
where xjrjz.编号=#linshi.编号
drop table #linshi
但是出来的结果是,如下:
myid 借方 贷方 余额
1 321 null
2 1000 null
3 212 null
4 21221 null
5 0 2124642.00
6 3213 2127534.00
7 321 2127420.00
前面几条记录结果是正确的,但是为什么后面结果是错的呢??
而且我想把余额在一开始的时候赋为零,用了如下语句:
select * from xjrjz order by 日期
set 余额=0 为什么报错?
另外,我想把贷方的计算也加进来请问达人如何实现?
请指教
个人以为 只建立 现金收款,现金付款 (甚至是同一张表)
现金日记帐 直接用视图 表示,余额什么的全部都实时计算,因为需要生成全部 现金日记帐 的应用理论上不会很多,而且通过在 现金收款,现金付款 表上建立合理的PK效率应该会高
我倾向与建立:
日记帐表:编号,项目,对象,借方,贷方,摘要,日期,余额
create view 现金日记帐
as
select 编号,项目,对象, 借方, 贷方, 金额,摘要,日期,(select sum(case when 借方 is not null then 0-金额 else 金额 from 日记帐表 k where k.编号<=k2.编号) 余额
from 日记帐表 k2
as
select 编号,项目,对象, 借方, 贷方, 金额,摘要,日期,(select sum(case when 借方 is not null then 0-金额 else 金额 end) from 日记帐表 k where k.项目=k2.项目 and k.对象=k2.对象 and k.编号<=k2.编号 ) 余额
from 日记帐表 k2
至于你现在的计算方法,
就用 ,(select sum(case when 借方 is not null then 0-金额 else 金额 end) from 日记帐表 k where k.项目=k2.项目 and k.对象=k2.对象 and k.编号<=k2.编号 ) 这个子查询计算余额就可以了。
update xjrjz x set x.余额=x.借方+(select 余额 from xjrjz where 日期=(select max(日期) from xjrjz where 日期<x.日期))
set 余额=isnull((select sum(借方) from #linshi where myid<=a.myid),0)
-isnull((select sum(贷方) from #linshi where myid<=a.myid),0)
from #linshi a
set @y2=0
update #linshi set @y1=@y2+isnull(借方,0)-isnull(贷方,0)
,@y2=@y1,余额=@y1
原因如下:
1、支出和收入不在同一张表,仅靠Datetime 事实上无法区分先后
比如 数据支出数据 200,时间 2004-01-01 00:00:00.000
因为 DateTime 时间最大分辨率为 千分只三如果有另一笔记录
收入 200,时间也是 2004-01-01 00:00:00.000
那,计算的时候用什么做依据?
感觉出入明细要精确,只有把收入和支出放在同一张表里 用 Identity 控制前后,需要计算余额的时候 使用 Group BY Sum 来得实惠。
2、日记帐表几乎是收入+支出表的总和,如此大的冗余 实在很困难,假如要不用事务控制 收入和支出 操作,那因为DateTime 的分辨率问题,后果就可能是毁灭性了;用了事务,一次变成锁定3张表的内容,开销好象忒大了点;
3、根据你的意思收入和支出的数据是可更改的,如果万一 哪次 忘记了用事务控制 日记帐的数据与其他两张表不符,将做何处理?所以还是觉得只做一张表,余额用视图计算来得保险
我想 上一条余额是不是时间最大的那一条相应的记录
如果是这样的话 不防是这样试试 set 余额=余额+借方 where 日期=(select max(日期) where )
我的方法是建一个临时表,插一个字段myid,并select * from xjrjz order by 日期.再对临时表里的余额进行计算。呵呵,很谢谢realgz(realgz)这么关注我的贴子。也谢谢你的帮助。
我的问题已经被zjcxc(邹建)的语句解决了。
我知道我的表的设计并不好,因为收款单和付款单的字段是一样的。但是我还是做了两张表,就是因为做现金日记帐的时候好做一些。收款单的金额放在借方,付款单的金额放在贷方。这样我在输入数据的时候,就不用判断他们的方向了。
我觉得你可能对我的表的意思还没有太清楚。我不是单纯算总和。我是要算每插入一条记录的后,余额的变化,只对每一条记录进行计算。
建立临时表,在临时表里计算,就没有那么麻烦了。因为我要确定,最后一条记录是什么。
其实你给我的代码我并没有看得太懂。你的那个金额字段是什么?作用又是什么?余额是怎么赋出来的啊?