表结构
inst_no inst_lvl sup_inst_no   bal
0000      1        0000        null
0001      2        0000        null
000101    3        0001        null
000102    4        000101      200
实现的查询结果:
inst_no inst_lvl sup_inst_no   bal
0000      1        0000        200
0001      2        0000        200
000101    3        0001        200
000102    4        000101      200
请问大侠,用sql改怎么实现?

解决方案 »

  1.   

    --第一行数据多余的吧
    SELECT a.inst_no,
           a.inst_lvl,
           a.sup_inst_no,
           (SELECT SUM(b.bal)
              FROM tt b
             START WITH b.inst_no = a.inst_no
            CONNECT BY PRIOR b.inst_no = b.sup_inst_no) bal
      FROM tt a;
      

  2.   

    第一行数据是最顶层的机构,我本来的表结构是这样的,
    cm_inst:机构表,inst_no inst_name sup_inst_no inst_lvlb_s_gla_sum:汇总表 inst_no ,bal
    想实现的功能就是逐级往上层汇总数据
      

  3.   

    inst_no inst_lvl sup_inst_no bal
    0000 1 0000 null
    0001 2 0000 null
    0002 2 0000 null
    000101 3 0001 null
    000102 4 000101 200
    000201 3 0002   100
    实现的查询结果:
    inst_no inst_lvl sup_inst_no bal
    0000 1 0000 300
    0001 2 0000 200
    0002 2 0000 100
    000101 3 0001 200
    000102 4 000101 200希望各位大侠帮忙咯
      

  4.   

    inst_no inst_lvl sup_inst_no bal
    0000 1 0000 null
    0001 2 0000 null
    0002 2 0000 null
    000101 3 0001 null
    000102 4 000101 200
    000201 3 0002 100
    实现的查询结果:
    inst_no inst_lvl sup_inst_no bal
    0000 1 0000 300
    0001 2 0000 200
    0002 2 0000 100
    000101 3 0001 200
    000102 4 000101 200
    000201 3 0002 100
    希望各位大侠帮忙咯
      

  5.   

    --假设数据表表名为tt,其实思路与上面一样,把第一行做特殊数据来处理
    --汇总的关键就是start with ... connct by ..实现树型结构的的语句
    --另外汇总的一行也可以使用group by rollup来生成
     WITH c AS( 
    SELECT a.inst_no,
           a.inst_lvl,
           a.sup_inst_no,
           (SELECT SUM(b.bal)
              FROM tt b
             START WITH b.inst_no = a.inst_no
            CONNECT BY PRIOR b.inst_no = b.sup_inst_no) bal
      FROM tt a where a.inst_no <> '0000')
      SELECT inst_no,
             inst_lvl,
             sup_inst_no,
             (SELECT SUM(bal) FROM c WHERE c.sup_inst_no = '0000') bal
        FROM tt
       WHERE tt.inst_no = '0000'
      UNION ALL
      SELECT * FROM c;oracle 树型查询