具体问题如下:这段sql语句能统计出来结果,但如果该年级没有班级的话我想要让显示值为0,count(*)就不显示了,请问如果要使没有一个班的年级下的班数都显示为0的话该如何处理呢!
    select count(*) "count", wf_instance.wfmodelid
    from wf_ins_step, wf_instance 
    where wf_ins_step.instanceid = wf_instance.id 
           and wf_instance.wfmodelid in ( 
                                         select ID 
                                         from WF_MODEL 
                                         where ID in (select WF_MODEL.id 
                                                      from WF_MODEL, WF_NODE_ACTORS
                                                      where WF_NODE_ACTORS.actor in            (  select a.ORG_ROLE_OID 
                 from user_user_orgrole a,user_org_role b 
                 where a.org_role_oid = b.org_role_oid 
                       and a.user_oid in (
                                           select OID 
                                           from user_user 
                                           where ID='hufang'
                                          )
                       ) and WF_MODEL.id = 2
                                                  )
                                   )
  group by  wf_instance.wfmodelid
   having count(*)=0
这段SQL语句也没有写太好,有帮优化的开贴加分噢

解决方案 »

  1.   

    我现在只想知道,如果为什么没有把count这个字段为0的所有值的行给显示出来呢,如果显示出来,又如何才能让这些为0的值的行显示出来呢
      

  2.   

    wf_ins_step表结构:
    序号 字段名称 中文名称 数据类型 长度 主键 空否 备注
    1 INSTANCEID 工作流实例标示符 NUMBER 28
    2 NODEID 节点标示符 VARCHAR2 32
    3 ACTOR 实际参与者 VARCHAR2 32 Y
    4 STATUS 状态 NUMBER 1
    5 JOBSTATUS NUMBER 1
    6 STATUSTIME 状态时间 DATE Y
    7 STATUSDESCRIPTION VARCHAR2 256 Y
    8 PREACTORS 可以参与审批的用户标识符列表 VARCHAR2 512 Y
    9 PASSED 审批通过计数 NUMBER 10 Y
    10 REFUSED 审批驳回计数 NUMBER 10 Y
    11 OTHERS 其他审批计数 NUMBER 10 Y
    12 APPGREENTIMES 绿灯审批计数 NUMBER 10 Y
    13 APPYELLOWTIMES 黄灯审批计数 NUMBER 10 Y
    14 APPREDTIMES 红灯审批计数 NUMBER 10 Y wf_instance表结构
    1 ID 工作流实例标示符 NUMBER 28 PK
    2 WFMODELID 工作流模型标示符 VARCHAR2 32
    3 CREATER 创建者用户标示符 VARCHAR2 32
    4 CREATETIME 创建时间 DATE
    5 STATUS 状态 NUMBER 1
    6 NAME 实例名称 VARCHAR2 64 Y WF_MODEL表结构:
    ID 工作流模型标示符 VARCHAR2 32 PK N
    NAME 工作流模型名称 VARCHAR2 64
    CREATER 创建者 VARCHAR2 32
    CREATETIME 创建时间 DATE
    LASTMODIFIER 最后修改者 VARCHAR2 32
    LASTMODIFYTIME 最后修改时间 DATE
    STATUS 状态 NUMBER 1
    SCHEDULE VARCHAR2 512 Y
    DESCRIPTION 描述 VARCHAR2 4000 Y
    COMPLEXNAME 复合名称 NUMBER 1 Y WF_NODE_ACTORS表结构:
    1 WFMODELID 工作流模型标示符 VARCHAR2 32 PK
    2 WFNODEID 节点标示符 VARCHAR2 32
    3 ACTOR 节点参与者用户标识 VARCHAR2 32
    4 ACTORPARAMETER 参与者参数 VARCHAR2 256 Y
      

  3.   

    列出部分了,然后语句我也省化一点吧:
    看看这段sql语句吧: select count(*) "count", wf_instance.wfmodelid
        from wf_ins_step, wf_instance 
        where wf_ins_step.instanceid = wf_instance.id 
         group by  wf_instance.wfmodelid
       having count(*)=0
    我执行的要求显示出来如下:
    年级   班数
       
       2000    17
       2003    13
       2004    14
       2005    18
       2006     0
       2007     0
       2008     0
       2009     2
    就是如果该年级下没有班,结果集中就显示为0
      

  4.   

    我已开了一个新贴,地址在:http://community.csdn.net/Expert/topic/3562/3562311.xml?temp=3.127688E-02
    有朋友会的话谢谢了!
      

  5.   

    把你那句话的所有的in改用exists,速度会提高很多的
      

  6.   

    to: ORARichard(没钱的日子好难过啊)
    兄弟真是细心,但我不需求,看年级表中有没有这两个年级的代码,没有的话也不列,这不是问题关键,
    50t
    to: bluelamb(bluelamb) 你说说看,是什么原因呢,大家都可以讨论下,
      

  7.   


     select b.wfmodelid,decode(id,null,0,count(*)) 
        from wf_ins_step a, wf_instance b
        where a.instanceid = b.id(+) 
      group by wfmodelid,id;
    你试一下这个能不能实现你的意思,我感觉你的wfmodelidj相当于一个年级吧,班级是具体的instance!
      

  8.   

    to: bluelamb(bluelamb) 还有列出部分修改的SQL语句来,我还不太明白噢,我是菜鸟的!^_^
      

  9.   

    to:lialin(阿林)
    这位大虾,你的这个decode(id,null,0,count(*)) 函数所用的几个参数,及这个函数发生的作为能不能说说呢
      

  10.   

    t0:to:lialin(阿林)
    你的这个方法不行的噢,
    测试下结果sql语句如下:
    结果集为空噢!
    select b.wfmodelid,decode(id,null,0,count(*)) 
        from wf_ins_step a, wf_instance b
        where a.instanceid = b.id 
      group by wfmodelid,id
        having decode(id,null,0,count(*))=0
      

  11.   

    to:ORARichard(没钱的日子好难过啊)
    大虾:没贴的表结构可以省掉部分条件撒!
    只有这些,后面还至少有7张表,我怕太多会使人抓不住重点的!
      

  12.   

    to: lialin(阿林) 
    ( 基本上是这样的啦,我真正用到的后面还有几个虚表都是结果集,核心就是如你所说的啦
      

  13.   

    这样是不是可以呢,你看一下满足你的要求不?SQL> select * from grade;                               GRADE_ID
    ---------------------------------------
                                       2002
                                       2003
                                       2004SQL> select * from class;                               GRADE_ID                                CLASS_ID CLASS_NAME
    --------------------------------------- --------------------------------------- --------------------
                                       2002                                       1 class1
                                       2002                                       2 class2
                                       2002                                       3 class3
                                       2003                                       1 class1
                                       2003                                       2 class2SQL> select grade_id,decode(max(class_id),null,0,count(*)) from (select a.grade_id,class_id from grade a,class b where a.grade_id=b.grade_id(+)) group by grade_id;                               GRADE_ID DECODE(MAX(CLASS_ID),NULL,0,CO
    --------------------------------------- ------------------------------
                                       2002                              3
                                       2003                              2
                                       2004                              0SQL>
      

  14.   

    to: lialin(阿林) 
    我试试吧
    select b.wfmodelid,decode(id,null,0,count(*)) 
        from wf_ins_step a, wf_instance b
        where a.instanceid = b.id 
      group by wfmodelid,id
        having decode(id,null,0,count(*))=0大虾,能不能改成我要的这种格式的SQL语句呢,我不太会用decode函数了,
    能不能帮我再说下你的这个decode函数的功能呢
    我再试下,成功马上结分!
      

  15.   

    create table grade(year number)
    create table class(year number,classno number)select g.year,decode(c.no,null,0,c.no) from grade g,(select year,count(*) no from class group by year) c where g.year=c.y
      

  16.   

    SQL> select grade_id,decode(max(class_id),null,0,count(*)) from (select a.grade_id,class_id from grade a,class b where a.grade_id=b.grade_id(+)) group by grade_id having count(*)=0;                               GRADE_ID DECODE(MAX(CLASS_ID),NULL,0,CO
    --------------------------------------- ------------------------------SQL>
      

  17.   

    不需要那个having 条件,如果加上就不会有结果出来了!
      

  18.   

    decode(字段,value1,value2,...,valuen,value(n+1),value(n+2))
    表示如果字段=value1,则返回value2;
    .
    .
    .
    如果字段=valuen,则返回value(n+1);
    其它的情况返回value(n+2)
      

  19.   

    decode
    是一个单行函数,与if-then-else语句相似.
      

  20.   

    TO: lialin(阿林) 
    大虾 如果像这类条件转化成一段集合的话,该如何处理呢
         where   wf_ins_step.preactors like '%,hufang'
                 or 
                 wf_ins_step.preactors like 'hufang,%' 
                 or wf_ins_step.preactors like '%,hufang,%' 
        如果要把字符串替换成返回一个记录集的话(select name from student )也就是判断该字符串是否属于该表学生名记录集中 例如
    student表:
      id    name    score
      1     wang     111
      2     ling     222
      3     hufang   444
      .....
      

  21.   

    to: ORARichard(没钱的日子好难过啊) 大虾,我现在知道这个函数如何用了,谢谢了!
    to: liuyi8903(西西) ^_^
    有哪个是学JAVA的可以到我们公司来面试噢,
    我们公司正在招人,大虾都来吧
    http://www.beautybeard.com
      

  22.   

    大侠不行呀select id,decode(max(instanceid),null,0,count(*))
      from (select a.id,b.instanceid 
            from wf_instance a,wf_ins_step b
            where a.id=b.instanceid)
      group by id      
     
    这一段执行后还是不可以得到0的结果集噢,
    我把表这两个表的结构再贴一次吧,
    wf_instance表结构:
    ID 工作流实例标示符 NUMBER 28 PK
    WFMODELID 工作流模型标示符 VARCHAR2 32
    CREATER 创建者用户标示符 VARCHAR2 32
    CREATETIME 创建时间 DATE
    STATUS 状态 NUMBER 1
    NAME 实例名称 VARCHAR2 64 Y
    INSPARAMETER 实例初始化参数 VARCHAR2 256 Y
    FINISHTIME 结束时间 DATE Y
    CREATER_ENTERPRISENAME 创建者企业名称 VARCHAR2 128 Y
    LASTMODIFYTIME 最后修改时间(即提交时间) DATE Y
    SUBMITCOUNT 提交次数 NUMBER 10 Y Wf_Ins_Step表结构INSTANCEID 工作流实例标示符 NUMBER 28
    NODEID 节点标示符 VARCHAR2 32
    ACTOR 实际参与者 VARCHAR2 32 Y
    STATUS 状态 NUMBER 1
    JOBSTATUS NUMBER 1
    STATUSTIME 状态时间 DATE Y
    STATUSDESCRIPTION VARCHAR2 256 Y
    PREACTORS 可以参与审批的用户标识符列表 VARCHAR2 512 Y
    PASSED 审批通过计数 NUMBER 10 Y
    REFUSED 审批驳回计数 NUMBER 10 Y
    OTHERS 其他审批计数 NUMBER 10 Y
    APPGREENTIMES 绿灯审批计数 NUMBER 10 Y
    APPYELLOWTIMES 黄灯审批计数 NUMBER 10 Y
    APPREDTIMES 红灯审批计数 NUMBER 10 Y
      

  23.   

    select * from grade;
    YEAR      
    ----------
          2000
          2003
          2004
    select * from class;
    YEAR       CLASSNO   
    ---------- ----------
          2000 a         
          2000 b         
          2003 b         
          2003 c         
    select g.year,decode(c.no,null,0,c.no) from grade g,(select year,count(*) no from class group by year) c where g.year=c.year(+)
    YEAR       DECODE(C.N
    ---------- ----------
          2000          2
          2003          2
          2004          0
    这是你要的结果吗
      

  24.   

    select g.id,decode (c.no,null,0,c.no) from wf_instance g,(select instanceid,count(0) from wf_ins_step group by instanceid) c where g.id=c.instanceid(+)
      

  25.   

    to: ATGC(这一生受了很多委屈吃了很多苦。。
    我是用一个简单的例子说明问题,我真正要解决得肯定不是这么简单的撒
    to: ORARichard(没钱的日子好难过啊) 
    我今天刚来试下
      

  26.   

    各位大虾,昨天真是有劳了,但我是笨笨,55555,问题套到我的SQL语句中就是不显示0
      

  27.   

    select count(*) "count", wf_instance.wfmodelid
        from wf_ins_step a, wf_instance b
        where wf_ins_step.instanceid = wf_instance.id 
               and  exists ( select ID from WF_MODEL c
                                             where c.wfmodelid=b.wfmodelid
                                             and  exists (select WF_MODEL.id 
                                                          from WF_MODEL d, WF_NODE_ACTORS e
                                                          where c.id=d.id and  exists
                                                          (  select a.ORG_ROLE_OID 
                     from user_user_orgrole f,user_org_role g 
                     where e.actor=f.e.actor and f.org_role_oid = g.org_role_oid 
                           and  exists (
                                               select OID 
                                               from user_user h 
                                               where ID='hufang' and h.oid=f.user_oid
                                              )
                           ) and WF_MODEL.id = 2
                                                      )
                                       )
      group by  wf_instance.wfmodelid
       having count(*)=0
      

  28.   

    to: bluelamb(bluelamb) 
    大虾
    你变表的引用名都太多了吧,而且局部结果集都取不到,报字段错误噢,
      

  29.   

    select instanceid,count(0) from wf_ins_step group by instanceid这句话对应在你的代码中显示的结果是什么
      

  30.   

    to: ORARichard(没钱的日子好难过啊)
    大虾,上面就是结果集了
      

  31.   

    to: lialin(阿林) 
    好,我贴下所有的表结构吧
      

  32.   

    select id,decode(min(instanceid),null,0,count(*))
      from (select a.id,b.instanceid 
            from wf_instance a,wf_ins_step b
            where a.id=b.instanceid)
      group by id
    这个没有问题
      

  33.   

    我正确测试显示如下结果,最好能帮我看下select decode(min(instanceid),null,0,count(*)),D.Id
    from wf_ins_step, wf_instance,
         (select ID 
          from WF_MODEL 
          where ID in (select WF_MODEL.id 
                       from WF_MODEL, WF_NODE_ACTORS
                       where WF_NODE_ACTORS.actor in ( select a.ORG_ROLE_OID 
                                                       from user_user_orgrole a,user_org_role b 
                                                       where a.org_role_oid = b.org_role_oid 
                                                             and a.user_oid in (select OID 
                                                                                from user_user 
                                                                                )
                                                       ) 
                                                       and WF_MODEL.id = WF_NODE_ACTORS.WFMODELID
                       )
        ) D    
    where wf_ins_step.instanceid = wf_instance.id 
          and 
          wf_instance.status = 2 
         
          and 
          wf_ins_step.status = 2 
          and 
          (  wf_ins_step.actor = 'hufang' 
             or 
             ( wf_ins_step.actor is null
               and 
               ( wf_ins_step.preactors like '%,hufang'
                 or 
                 wf_ins_step.preactors like 'hufang,%' 
                 or wf_ins_step.preactors like '%,hufang,%' 
               )  
             )      
           )
          and 
          wf_instance.wfmodelid =D.Id
    group by d.id 
    执行的结果显示如下:
    decode(min(instanceid),null,0,count(*))         ID
    1                                      GSA02
    1                                      GSA07
    1                                       GSA11
    1                                      GSA12
    1                                      GSA40
    1                                      GSA41但因为表中统计出来的wf_instance表ID所对应的子表中有些没有下一级子表,我希望显示为0
    也就是结果集为:
    decode(min(instanceid),null,0,count(*))         ID
    1                                      GSA02
    1                                      GSA07
    1                                       GSA11
    1                                      GSA12
    1                                      GSA40
    1                                      GSA41
    0                                             GSA54(这两个没有下一级)
    0                                             GSA65(这两个没有下一级)
    .....