Search code examples
sqlms-accessselectjet

SQL Selecting finished orders with multiple operations


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

Solution

  • 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