是想在数据库端实现
还是想用java代码?

解决方案 »

  1.   

    最好在数据库段实现,这样我在java代码里处理起来会好一些,如果不行的话,在java代码里也不是不行的
      

  2.   

    select a.kmdm, a.jlje-a.dlje+b.j-b.d from hz a,z_pz b 
    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或者用视图也是一个不错的方法
      

  3.   

    这一条SQL好像真的很难实现,我现在用两个sql来查询,一条查询hz的结果,一条是z_pz的,可还是没法解决向一级和二级科目相加的事,因为两个表的查询结果是不同的不太可能把他们硬加在一起呀还是郁闷呀,高手在帮帮想个主意吧,如果是视图的话要怎么解决呢?望高人指点!
      

  4.   

    用视图的话
    先将每个记录单独的值查询出来,保存到视图中,然后将视图中的数据再进行相加操作
    将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
      

  5.   

    对不起各位我还要补充一点,用view肯定是一个好思路,但还有一点就是在hz表里的kmdm是必须都显示的,而按照高人的sql查询出来的只是kmdm在z_pz里有记录的,这点和我的初衷是不一样的,望高人们在给小弟一个回答
      

  6.   

    你这个应是财务软件的问题吧!
    101
    10101
    1010101
    10102
    1010201
    101是一级科目
    你可以把最下级的科目分开(这可能要借助临时表)
    如:1010101把后面01去掉->10101
       1010201............->10102
    依次类推10101..->101
            10102..->101
    这样你就可以把你想要合计的值放入对应的科目下面,又因为它的值又是从最下面最下面的科目分出来的,所以不会加重复的值!
    以上会用到好多条SQL语句,写成存储过程最合适!
      

  7.   

    楼上 Henu(龙之图) 说的是最好,最通用的方法
    那样做,思路清晰,程序严谨,不容易出错啊,呵呵
      

  8.   

    Henu(龙之图)果然是传说中的高人,可以一下就分析出我程序的类型,小弟的确是做的财务软件,由于是第一次碰这方面的东西所以逻辑上还是有点混乱,能否在说的详细一些呢?我不是贪婪,因为只是在想了解一下各位高人的解决办法。
      zyg158(以后坚决不接分了!谁给我分我跟谁急!!!)如果表2中没有102及他的下一级代码就直接显示102的就行了。
      

  9.   

    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
      

  10.   

    知道了楼主,呵呵TO:Henu(龙之图)
    用游标是不是效率比较低?
    有没有更好的方法
      

  11.   

    对不起,是我的错误,我忘记告诉大家了,我这其中还涉及到一个循环的问题,因为在查询的时候可能会有多个z_pz表,像什么z_pz01 z_pz02了等等,一旦有他们的参与龙之图大哥说的那个好像就不容易实现了,希望各位能在给小弟出些主意,另外祝大家圣诞快乐
      

  12.   

    如果用oracle数据库,我建议你使用过程,或者包。并且在实现逻辑数据是,使用前套表技术。即可以保存临时逻辑数据,又可节省系统的空间。
      

  13.   

    我的数据库是SQl server,该怎么办?用sql在外边实现起来都不太容易,放到存储过程里不也是一样的吗,无非就是省一些资源,看起来干净一些吗?不到我理解的对不对,望高人指点 谢谢!
      

  14.   

    这个关头为什么还要推荐换数据库呢?MS SQL SERVER完全可以实现的!
    存储过程是MS对SQL语句的一个扩展,使你不用借助外部语言就可以实现一些如循环之类的控制实现!
    在开发数据库软件的时候,最重要的就是查询的了,查询质量的好坏直接影响着整个程序的质量!
    我们取数据的标准就是在不动用原数据的基础上(可借助临时表,最后删除),来取出我们想要的数据,但是有些数据我们为了减少数据间的耦合,我们会把它不作运算,而直接放入数据库中,这样我们取的时候要做一些运算,才能得到我们想要的数据,所以这并非是一两条SQL语句所能实现的,所以这个时候,存储过程的优势就会显出来了!
    如果楼主真的没办法了,给龙之图发个伊眉儿吧 [email protected] 并附带非常详细的资料!