I have a list of orders with suboperations. How can I create a list of finished orders? Finished order must have finished all suboperations.
Table "orders":
order_no | suboperation | finished
1 | preparing | 01/01/2009
1 | scrubbing | 01/05/2009
1 | painting | 01/10/2009
2 | preparing | 02/05/09
2 | painting | NULL
3 | preparing | 03/01/2009
3 | scrubbing | 03/15/2009
3 | painting | 03/10/2009
4 | bending | NULL
4 | crashing | NULL
4 | staining | NULL
4 | painting | NULL
Desired output (finished orders):
order_no
1
3
You'll could also use count, group by and having. This avoids having to do any table joins which is more efficient.
create table #Orders (
order_no int,
suboperation varchar(30),
finished smalldatetime)
insert into #Orders values (1 , 'preparing' , '01/01/2009')
insert into #Orders values (1 , 'scrubbing' , '01/05/2009')
insert into #Orders values (1 , 'painting' , '01/10/2009')
insert into #Orders values (2 , 'preparing' , '02/05/09')
insert into #Orders values (2 , 'painting' , NULL)
insert into #Orders values (3 , 'preparing' , '03/01/2009')
insert into #Orders values (3 , 'scrubbing' , '03/15/2009')
insert into #Orders values (3 , 'painting' , '03/10/2009')
insert into #Orders values (4 , 'bending' , NULL)
insert into #Orders values (4 , 'crashing' , NULL)
insert into #Orders values (4 , 'staining' , NULL)
insert into #Orders values (4 , 'painting' , NULL)
select
order_no,
count(1) As NoOfSubtasks --count(1) gives the number of rows in the group
count(finished) As NoFinished, --count will not count nulls
from #Stuff
group by
order_no
having
count(finished) = count(1) --if finished = number of tasks then it's complete
drop table #Orders