select a.subid,sum(b.numA),a.isset from Sub a,Daily b where a.subid=b.subid and a.isset=1
group by a.subid,a.isset
union all
select a.subid,sum(b.numA),a.isset from Sub a,Daily b where 
b.subid like a.subid||'%' and a.isset=0
group by a.subid,a.isset
;

解决方案 »

  1.   

    SQL> select * from sub;SUBID                     ISSET
    -------------------- ----------
    101                           1
    102                           0
    102-101                       1
    102-102                       0
    102-102-101                   1
    102-102-102                   16 rows selected.SQL> select * from daily;SUBID                      NUMA
    -------------------- ----------
    101                           1
    102                           2
    102-101                       3
    102-102                       4
    101                           5
    102-102-101                   6
    102-101                       7
    102-102-101                   88 rows selected.SQL> select a.subid,sum(numa),isset from sub a,daily b where a.isset=1 and a.subid=b.subid group by 
    a.subid,isset
      2  union all
      3  select a.subid,sum(numa),isset from sub a,daily b where a.isset=0 and b.subid like a.subid || '
    %' group by a.subid,isset;SUBID                 SUM(NUMA)      ISSET
    -------------------- ---------- ----------
    101                           6          1
    102                          30          0
    102-101                      10          1
    102-102                      18          0
    102-102-101                  14          1注意:我的isset是number型
      

  2.   

    很简单呀!
    SELECT SUM(Daily.NUMA) FROM SUB,Daily
    WHERE SUB.SUBID(+) = Daily.SUBID
    AND B.SUBID LIKE 'A%'因为里面的数据决定了这个性质.
      

  3.   

    不好意思,是我弄错了,表不是这么简单的……改正sub表和daily表如下,其他数据、要求不变
    Sub表如下:
    id(char)  subid(char)  isset(char)
    11         101            1
    12         102            0
    13        102-101         1
    14        102-102         0
    15      102-102-101       1
    16      102-102-102       1
    说明:
    id为主键约束。其中subid中为"*1-*2"即表明它是subid为"*1"的子科目,如102-102-101即为102-102的子科目,而102-102又为102的子科目;isset为0,说明此科目存在子科目,isset为1说明其为底层科目,即不存在其子科目,如101,102-101,102-102-101,102-102-102。当然,命名可以为*-*的其他符号,比如"科目-002",但"-"符号必定是子科目必备的特征。
    Daily表如下:
    id(char)   numA(num)
    11            1
    12            2
    13            3
    14            4
    11            5
    15            6
    13            7
    15            8
    说明:此subid是sub表中subid外键,可以不唯一。
    现需要对此表做如下统计:
    对于任一subid A,若其对应sub表中isset字段为1(即为底层科目),直接累加Daily表中subid=A的所有记录字段numA之和sum(numA);若其对应sub表中siset字段为0,则累加Daily表中subid=A和subid=A-*的所有记录字段numA之和sum(numA)。
    如上表记录统计应得到如下结果:
    subid          numA        isset
    101            1+5=6         1
    102         2+3+4+6+7+8=30   0 
    102-101       3+7=10         1
    102-102      4+6+8=18        0
    102-102-101   6+8=14         1
      

  4.   

    注意subid可能有这种情况,比如102和1022等,直接like subid||'%'是不行的说!高手们继续帮忙吧,我加分。
    老实说,我对oracle的pl/sql不怎么熟
    另外,写成视图也行。
      

  5.   

    无非是相等的连接条件改一改a.id=b.id
      

  6.   

    大哥们,看清楚再说话好不好?主要是要对subid进行统计的
    就是说若无子科目(isset=1),直接统计这个subid在daily表中的id记录就行
    若有子科目(isset=0),就需要统计自身和所有子科目(包括子科目的子科目)的subid对应的id在daily的所有记录和。
      

  7.   

    得了,通过下面的语句
    select * from (select A.id,sum(A.numA) as num,B.subid,B.isset from daily A, sub B
    where A.id = B.id
    group by A.id,B.subid,B.isset)
    我现在只需要如下:
    对select的结果如下进行以上统计!!!!!!!!!!
    id    NumA     subid           isset   
    11     6        101              1   
    12     2        102              0
    13     10       102-101          1
    14     4        102-102          0
    15     14       102-102-101      1
    若isset为0,如id=12的记录,统计subid=102和subid=102-*的所有记录numA的和。
    isset为1则不变
      

  8.   

    SQL> select * from sub;SUBID                     ISSET ID
    -------------------- ---------- ----------
    101                           1 11
    102                           0 12
    102-101                       1 13
    102-102                       0 14
    102-102-101                   1 15
    102-102-102                   1 16
    1022                          1 177 rows selected.SQL> select * from daily;SUBID                      NUMA
    -------------------- ----------
    11                            1
    12                            2
    13                            3
    14                            4
    11                            5
    15                            6
    13                            7
    15                            8
    17                            99 rows selected.SQL> select a.subid,sum(numa),isset from sub a,daily b where a.id=b.subid and a.isset=1 group by a.s
    ubid,isset
      2  union all
      3  select a.subid,sum(b.numa),a.isset from sub a,(select c.subid as subid,d.numa as numa from sub 
    c,daily d where c.id=d.subid ) b where a.isset=0 and (b.subid like a.subid || '-%' or b.subid=a.subi
    d) group by a.subid,a.isset;SUBID                 SUM(NUMA)      ISSET
    -------------------- ---------- ----------
    101                           6          1
    102-101                      10          1
    102-102-101                  14          1
    1022                          9          1
    102                          30          0
    102-102                      18          06 rows selected.