1

サブオペレーションのあるオーダーのリストがあります。完了した注文のリストを作成するにはどうすればよいですか? 完了したオーダーは、すべてのサブオペレーションを完了している必要があります。

テーブル「注文」:

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

希望する出力 (完成した注文):

order_no
1
3
4

4 に答える 4

3

countgroup byhavingも使用できます。これにより、より効率的なテーブル結合を行う必要がなくなります。

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
于 2009-08-05T16:33:54.723 に答える
1

ここでは古き良きWHERE NOT EXISTS句が機能するはずです。

SELECT DISTINCT o.order_no
FROM orders o
WHERE NOT EXISTS (SELECT p.order_no
                  FROM orders p
                  WHERE p.order_no = o.order_no 
                  AND p.finished IS NULL)
于 2009-08-05T16:32:14.647 に答える
0

私は MIN 関数を使用する方法を見つけようとしていましたが、これを思いつきました:

注文番号を選択

注文から

GROUP BY order_no

HAVING (MIN(ISNULL(終了, 0)) <> 0)

nullは迷惑になる可能性があります...

パフォーマンスはそれほど高くないかもしれませんが、私にとっては理解しやすいです。

于 2009-08-05T17:27:12.727 に答える
-1
SELECT order_no, suboperation, finished
FROM orders o1
WHERE NOT EXISTS(
    SELECT 1 
        FROM orders o2 
        WHERE o1.order_no = o2.order_no 
        AND o2 IS NULL )
于 2009-08-05T16:33:46.423 に答える