--这样不行吗? 为什么要用游标insert into 相应的表(acctID,费用总计) select accid,sum(费用总计) from 费用表
--例如: 一个帐户表:TabAccount(acctID) 一个用户表:TabUser(userID,acctID) 一个费用表:Tabexpens(userid,expens)那就可以这样统计: insert into 结果表(accid,expens) select a.accid,expens=sum(b.expens) from tabuser a inner join tabexpens b on a.userid=b.userid group by a.accid
需要到别的表中读取,例如,
在统计一个用户的费用时.
查看该用户使用了哪些业务,哪些业务的月租费用又是多少多少等.
所以对每个用户,都需要一个检索并统计的过程.而最终要给这个用户所看到的,是他在某个时间段内,他所花费的钱及他所在的帐户余额的变化。而帐户中所花费的钱,有可能是该帐户中别的用户所花掉的,并不全是他个人所用到的。大多数的帐户和用户是一一对应的关系的,
但也有些帐户是一对多的,即一个帐户对应多个用户。
select accid,sum(费用总计) from 费用表
一个帐户表:TabAccount(acctID)
一个用户表:TabUser(userID,acctID)
一个费用表:Tabexpens(userid,expens)那就可以这样统计:
insert into 结果表(accid,expens)
select a.accid,expens=sum(b.expens)
from tabuser a inner join tabexpens b on a.userid=b.userid
group by a.accid
一个用户表:TabUser(userID,acctID)一个开通业务表:TabUserSrv(UserID,SrvID)
一个业务表TabSrv(SrvID,MonthBill) --MonthBill指该业务的月租费用中间还有些如
用户充值记录表TabFill、转帐记录表等这些都是属于统计之中。因此每个用户的统计包括多种费用。
这些都需要保存到用户帐单表中。而用户帐单的字段包括“起初余额、月租费用、业务月租费用...、终止余额.其中起初余额和终止余额应该是帐户中的金额.而该用户的帐户的终止余额,只有在统计完该帐户下所有用户之后才能计算出来。
这个统计就是这点比较麻烦的.
在计算每一个用户的时候不能直接用一句简单的inner join或者left outer join就可以实现的,这个时候我一般会用游标来实现,这个时候就必须用两级游标了。
但是,在第二级游标的时候,你可以尽量把一些可以用inner join的就用inner join,尽量缩减合计变量的数量,这就可以尽量提高效率了。
一般一两小时执行完整年的进销存数据我也试过。你那个看来是移动业务数据表吧,即使运行一两小时也没有什么问题啊。我看移动的计费也是这样的吧,计费都是要一两天才能出来的。
我觉得效率不是问题,主要是用游标写出来的程序比用inner join或者left outer join写出来的清晰很多。
一个帐户表:TabAccount(acctID,Money,...) --Money指的是该帐户的金额.
一个用户表:TabUser(userID,acctID,...) --FK acctID一个开通业务表:TabUserSrv(UserID,SrvID)
一个业务表TabSrv(SrvID,MonthBill) --MonthBill指该业务的月租费用中间还有些如
用户充值记录表TabFill、转帐记录表等对每个用户都需生成帐单:
其中必须要有的"起始金额"和"终止金额"
而金额只有帐户中有。而这"终止金额"并不能简单的用"起始金额"减去该用户的费用,
而是要减去所有和该用户在同一帐下的所有用户的费用。每个用户根据所开的业务不同,所以费用也都不同,都需单独计算的.利用视图我觉得似乎没有必要.
但是生成用户的帐单中"起始金额"和"终止金额",都只是用“起始金额"减去该用户的费用,得到
“终止金额”的
这样对帐户和用户是一一对应的倒没错,若该帐户下有多个用户的话,用户看到那帐单会糊涂的,
只有该帐户下最后结算的用户的余额是和帐户中的余额是一致的.
呵呵,所以要改写过了。
elect userID,sum(费用)
from TabUser
group by userID
呵呵。的确是这样。慢慢用游标玩吧。。不错的。虽然速度慢悠悠的,不过思路很清晰,不会写错。。