2017-02-15 3 views
0

表注文行を選択することは、同様の行のための別の基準を満たす場合にのみ

Status_id Order_number 
100  ord1 
200  ord2 
100  ord3 
300  ord2 
100  Ord4 
400  ord2 
200  ord1 
200  ord3 

IはStatus_id=100又は200であるすべての注文を必要とするが、同じ注文がStatus_id=400を持っている場合、それが選択されるべきではありません。 上記の例では、ord1,ord3,ord4を選択する必要があります。しかしOrd2status_id=400と同じであるため、選択しないでください。

+0

あなたの要件を満たす注文には、「order_number」だけを表示する必要がありますか、または行全体を表示する必要がありますか(つまり、status_idを含む)ですか? – mathguy

+0

実際の要件は、status_id、Order_number、order_date、account_numberなどを含む行全体を表示することです。代わりに、上記のクエリからorder_numberを収集してから、すべての情報を取得するためにテーブルを再クエリします。私の知識のために、より単純な解決策があれば、素晴らしいことになるでしょう。 Mathguyに感謝します。 –

+0

これは、望む結果を得るには非常に非効率的な方法です。 – mathguy

答えて

2

これは容易にgroup byhavingで解決される問題のタイプである:

select order_number 
from orders 
group by order_number 
having sum(case when status in (100, 200) then 1 else 0 end) > 0 and 
     sum(case when status = 400 then 1 else 0 end) = 0; 
+0

ゴードン・リノフ:ありがとう。それは素晴らしい作品です! –

+0

@DevadasWagle。 。 。 OPとして、あなたが好きな答えを受け入れることができます。私はあなたがなぜあなたがこの質問にあなたが尋ねた質問に最も直接的な答えと思われるこの答えを受け入れないのか不思議です。 –

+0

ゴードン - 私はOPではないとうまくいけば、OPはあなたに彼または彼女の答えを与えるでしょう。しかし、元の投稿の下のコメントを見たいと思うかもしれません。 OPが提供した説明を尋ねたことがわかります(記事自体を編集するのではなく、コメント内で)。私は、OPが明確化を提供した後にのみ私の答えを書いた。多分あなたの質問に答えます。 – mathguy

2

あなたはすべての行の完全な詳細だけではなく、注文番号が必要な場合は、その後、あなたは分析関数を使用する必要があります集合体ではなく、この場合、行の条件付き解析カウントはtest_data=400です。

with 
    test_data (status_id, order_number) as (
     select 100, 'ord1' from dual union all 
     select 200, 'ord2' from dual union all 
     select 100, 'ord3' from dual union all 
     select 300, 'ord2' from dual union all 
     select 100, 'ord4' from dual union all 
     select 400, 'ord2' from dual union all 
     select 200, 'ord1' from dual union all 
     select 200, 'ord3' from dual 
    ) 
-- end of test data (not part of the query); SQL query begins below this line 
select status_id, order_number 
from  (select status_id, order_number, 
        count(case when status_id = 400 then 1 end) 
          over (partition by order_number) as st_400_cnt 
      from test_data 
     ) 
where status_id in (100, 200) 
    and st_400_cnt = 0 
order by order_number, status_id -- if needed 
; 

STATUS_ID ORDER_NUMBER 
--------- ------------ 
     100 ord1 
     200 ord1 
     100 ord3 
     200 ord3 
     100 ord4 

5 rows selected. 
+0

ありがとうございました。それは素晴らしい作品です! –

関連する問題