解惑一:
1、创建表并插入数据
create
table
Projects
(
workorder_id
char(5)
not
null,
step_nbr
integer
not
null
check
(step_nbr
between
0
and
1000),
step_status
char(1)
not
null
check
(step_status
in
('C','W')),
primary
key
(workorder_id,step_nbr)
)
insert
into
Projects(workorder_id,step_nbr,step_status)
values('AA100',0,'C'),
('AA100',1,'W'),
('AA100',2,'W'),
('AA200',0,'W'),
('AA200',1,'W'),
('AA300',0,'C'),
('AA300',1,'C')
2、实际上要找到的工序即是第0道工序为为完成Complete,其他非0工序为Waiting
select
workorder_id
from
Projects
as
p1
where
step_nbr
=
0
and
step_status
=
'C'
and
'W'
=
ALL(select
step_status
from
Projects
as
p2
where
step_nbr
<>
0
and
p1.workorder_id
=
p2.workorder_id)
解惑二:
1、当第0道工序为Complete和非0工序为Waiting时则等于1,当工序的累加=Count函数时则证明满足
select
workorder_id
from
Projects
group
by
workorder_id
having
SUM(case
when
step_nbr
<>
0
and
step_status
=
'W'
then
1
when
step_nbr
=
0
and
step_status
=
'C'
then
1
else
0
end)
=
COUNT(step_nbr)
解惑三:
1、方法一
select
workorder_id
from
Projects
group
by
workorder_id
having
COUNT(*)
=
COUNT(case
when
step_nbr
=
0
and
step_status
=
'C'
then
1
else
null
end)
+
COUNT(case
when
step_nbr
<>
0
and
step_status
=
'W'
then
1
else
null
end
)
2、方法二:利用了not null和check()约束
select
workorder_id
from
Projects
where
step_status
=
'C'
group
by
workorder_id
having
SUM(step_nbr)
=
0