用视图的话 先将每个记录单独的值查询出来,保存到视图中,然后将视图中的数据再进行相加操作 将select a.kmdm, a.jlje-a.dlje+b.j-b.d from hz a,z_pz b where a.kmdm=b.kmdm 的结果作为视图 具体用法见sql server 帮助中的view
hz表 kmdm dmmc jlje dlje jfe01 dfe01 jfe02 dfe2 z_pz表 kmdm j d hz.jlje-hz.dlje+z_pz.j-z_pz.d 你看这样行不行: select hz.kmdm,hz.jlje,hz.dlje,z_pz.j,z_pz.d into temp from hz,z_pz where hz.kmdm=z_pz.kmdm --这样完成了初步的取值 alter table temp add column hj money --hj 字段用于存放hz.jlje-hz.dlje+z_pz.j-z_pz.d 的 值,实际上如果你用的值不多的话,这个字段可以不加 下面就是要完成子类科目往总科目的汇总 如我说的那样可以从最下面的科目去01汇总 这里面要用到游标:下面只是一个用游标的例子 declare price_sz scroll cursor for select item_id,price_week from priceweek where (week_init = @week_init) and (month_yuef = @month_yuef) and (month_year = @month_year) open price_sz --(price_sz游标名 打开游标) fetch first from price_sz into @item_id,@price_week --取第一条值 while @@fetch_status = 0 --当取值成功 begin update price_temp set price_sz=@price_week where item_id=@item_id fetch next from price_sz into @item_id,@price_week --循环取下一条值 end close price_sz deallocate price_sz最后数据用完后记得要 drop table temp
where a.kmdm=b.kmdm
这样只能列出每条记录的单独结果,没有加上子科目记录的如果要加上子科目记录的值,最好在子科目的记录里标明它的一级科目是哪个,
这样应该通过一个select语句就能搞定,如:
kmdm dmmc jlje dlje jfe01 dfe01 jfe02 dfe2 parent
101 ss 100 0 10 0 20 0 0
10101 rr 200 0 20 0 50 0 101
102 jj 0 50 0 36 0 7 0或者用视图也是一个不错的方法
先将每个记录单独的值查询出来,保存到视图中,然后将视图中的数据再进行相加操作
将select a.kmdm, a.jlje-a.dlje+b.j-b.d from hz a,z_pz b where a.kmdm=b.kmdm 的结果作为视图
具体用法见sql server 帮助中的view
101
10101
1010101
10102
1010201
101是一级科目
你可以把最下级的科目分开(这可能要借助临时表)
如:1010101把后面01去掉->10101
1010201............->10102
依次类推10101..->101
10102..->101
这样你就可以把你想要合计的值放入对应的科目下面,又因为它的值又是从最下面最下面的科目分出来的,所以不会加重复的值!
以上会用到好多条SQL语句,写成存储过程最合适!
那样做,思路清晰,程序严谨,不容易出错啊,呵呵
zyg158(以后坚决不接分了!谁给我分我跟谁急!!!)如果表2中没有102及他的下一级代码就直接显示102的就行了。
z_pz表 kmdm j d
hz.jlje-hz.dlje+z_pz.j-z_pz.d
你看这样行不行:
select hz.kmdm,hz.jlje,hz.dlje,z_pz.j,z_pz.d into temp from hz,z_pz where hz.kmdm=z_pz.kmdm --这样完成了初步的取值
alter table temp add column hj money --hj 字段用于存放hz.jlje-hz.dlje+z_pz.j-z_pz.d 的 值,实际上如果你用的值不多的话,这个字段可以不加
下面就是要完成子类科目往总科目的汇总
如我说的那样可以从最下面的科目去01汇总
这里面要用到游标:下面只是一个用游标的例子
declare price_sz scroll cursor for select item_id,price_week from priceweek where (week_init = @week_init) and (month_yuef = @month_yuef) and (month_year = @month_year)
open price_sz --(price_sz游标名 打开游标)
fetch first from price_sz into @item_id,@price_week --取第一条值
while @@fetch_status = 0 --当取值成功
begin
update price_temp set price_sz=@price_week where item_id=@item_id
fetch next from price_sz into @item_id,@price_week --循环取下一条值
end
close price_sz
deallocate price_sz最后数据用完后记得要
drop table temp
用游标是不是效率比较低?
有没有更好的方法
存储过程是MS对SQL语句的一个扩展,使你不用借助外部语言就可以实现一些如循环之类的控制实现!
在开发数据库软件的时候,最重要的就是查询的了,查询质量的好坏直接影响着整个程序的质量!
我们取数据的标准就是在不动用原数据的基础上(可借助临时表,最后删除),来取出我们想要的数据,但是有些数据我们为了减少数据间的耦合,我们会把它不作运算,而直接放入数据库中,这样我们取的时候要做一些运算,才能得到我们想要的数据,所以这并非是一两条SQL语句所能实现的,所以这个时候,存储过程的优势就会显出来了!
如果楼主真的没办法了,给龙之图发个伊眉儿吧 [email protected] 并附带非常详细的资料!