有这两个表
A
sid            byamount(金额)              yyyymm(月份)
LSA08001        3050.00                       200706
LSA08001        520                           200707
LSA08001       420                            200708
LSB05001       230                            200706
LSB05001       450                            200707
LSB05001       620                            200708
LSC05001       720                            200706
LSC05001       1500                           200707
LSC05001       600                            200708
LSD08001        320                           200705
............sid          parentid(上线)      
LSC05001     LSC05001
LSB05001     LSC05001
LSA08001     LSB05001
LSD08001     LSA08001
............
上线包含下线,现在要统计上线LS05001三个月的业绩该怎么统计,因为下线有可能是别的上线,这个是无穷尽的

解决方案 »

  1.   

    LSD08001        320                           200705
    应为:
    LSD08001        320                           200706
      

  2.   

    select sum(t1.byamount)
    from t1,(select t2.sid from t2 start with t2.sid='LS05001'
             connect by prior t2.sid=t2.parentid)t3
    where t1.sid = t3.sid 
    and to_date(yyyymm||'10', 'YYYYMMDD') between ? and ?两个问号代表时间段
      

  3.   

    上面的社友,我不太明白你写的
     to :kinglht 上线包含下线的业绩 LSC05001包含LSC05001,LSB05001,LSA08001 ,LSD08001的业绩,如果LSD08001还有下线的话,再包括下线的业绩
      

  4.   

    select t2.sid from t2 start with t2.sid='LS05001'
             connect by prior t2.sid=t2.parentid
    这一句就是找出LS05001所有直接或者间接下线的sid,
    然后通过这些sid去求和
      

  5.   

    manyroads(一个巴掌照样拍响)的SQL很好,不过有点小问题,从测试数据中发现:sid 和 parentid 有可能相等, 如:
    sid parentid(上线)
    LSC05001 LSC05001
    如果这样,必须把这种数据特殊处理。可以参考下面的SQL语句:
    select sum(t1.byamount)
    from t1
    where 月份条件 
    and ( sid = 'LSC05001' or
    sid in 
    (select t3.sid from (select * from t2 where sid<>parentid) t3
      start with t3.sid='LSC05001' connect by prior t3.sid=t3.parentid ));说明一下:
    1。关于求三个月的业绩,这个条件根据需求你可以自己写。
    2。sid包括自己本身和所有的下线,所以用OR的关系。
    3。用in效率不高,但是比较清晰,你可以适当改写成类似manyroads(一个巴掌照样拍响)的SQL。
      

  6.   

    我那个子句已经能够得到start with t3.sid='LSC05001' 这里的'LSC05001' 
    如果测试数据是有可能sid=parentid,我个人觉得这样的数据不太符合逻辑
    可以考虑把这样的记录的parentid改为null
    否则就加上nocycle关键字,以避免循环