Select a.act_id,b.service_no,a.sum_task,b.task_exec,nvl(c.task_compt,0) From 
(Select  act_id,service_no,Count(1) sum_task From dsaletask_l
dsaletask_l  Group By act_id,service_no ) a ,
(Select  act_id,service_no,Count(1) task_exec From dsaletask_l
dsaletask_l Where status_code='02' Group By act_id,service_no ) b ,
(Select  act_id,service_no,Count(1) task_compt From dsaletask_l
dsaletask_l Where status_code='04' Group By act_id,service_no ) c Where a.act_id = b.act_id(+) And a.act_id=c.act_id(+) And a.service_no=b.service_no(+) And a.service_no=c.service_no(+)

解决方案 »

  1.   

    应该换个算法:
    Select act_id,service_no,
      Sum(1) sum_task,
      Sum(decode(status_code,'02',1,0)) task_exec, --改用case也可以
      Sum(decode(status_code,'04',1,0)) task_compt
    From dsaletask_l Group By act_id,service_no最好建个组合索引act_id,service_no ,并强制用上如果只能在status_code上建索引的话,就按楼主的写法吧,改了也没意义
      

  2.   


    楼主可以用 left join或者right join 或者 inner join,这个比你的where条件连接效率上要高些!