具体问题如下:这段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语句也没有写太好,有帮优化的开贴加分噢
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 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
看看这段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
有朋友会的话谢谢了!
兄弟真是细心,但我不需求,看年级表中有没有这两个年级的代码,没有的话也不列,这不是问题关键,
50t
to: bluelamb(bluelamb) 你说说看,是什么原因呢,大家都可以讨论下,
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!
这位大虾,你的这个decode(id,null,0,count(*)) 函数所用的几个参数,及这个函数发生的作为能不能说说呢
你的这个方法不行的噢,
测试下结果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
大虾:没贴的表结构可以省掉部分条件撒!
只有这些,后面还至少有7张表,我怕太多会使人抓不住重点的!
( 基本上是这样的啦,我真正用到的后面还有几个虚表都是结果集,核心就是如你所说的啦
---------------------------------------
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>
我试试吧
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函数的功能呢
我再试下,成功马上结分!
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
--------------------------------------- ------------------------------SQL>
表示如果字段=value1,则返回value2;
.
.
.
如果字段=valuen,则返回value(n+1);
其它的情况返回value(n+2)
是一个单行函数,与if-then-else语句相似.
大虾 如果像这类条件转化成一段集合的话,该如何处理呢
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
.....
to: liuyi8903(西西) ^_^
有哪个是学JAVA的可以到我们公司来面试噢,
我们公司正在招人,大虾都来吧
http://www.beautybeard.com
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
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
这是你要的结果吗
我是用一个简单的例子说明问题,我真正要解决得肯定不是这么简单的撒
to: ORARichard(没钱的日子好难过啊)
我今天刚来试下
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
大虾
你变表的引用名都太多了吧,而且局部结果集都取不到,报字段错误噢,
大虾,上面就是结果集了
好,我贴下所有的表结构吧
from (select a.id,b.instanceid
from wf_instance a,wf_ins_step b
where a.id=b.instanceid)
group by 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(这两个没有下一级)
.....