2017-02-22 5 views
0

でビューを作成する:第は、私は、以下の条件に基づいてデータを取得し、Oracleでビューを作成するOracleデータベース

状況:同じCALLTICKET &ためTABLE1に ORDERNO要求された5つの部分があります。 最初の4つが受信され、1つはDEL_FLG 'D'を設定するDeleteに要求されます。第二に

TABLE1 
    ------------------------------------------------------ 
    CALLTICKET ORDERNO PART_NO RECEIVE_ETA DEL_FLG 
    123456  100900 ABC-123 09-02-2017  N 
    123456  100900 ABC-121 09-02-2017  N  
    123456  100900 ABC-456 09-02-2017  N 
    123456  100900 ABC-697 09-02-2017  N 
    123456  100900 ABC-852     D 

状況:同じCALLTICKET &ためTABLE1に ORDERNO要求された5つの部分があります。 2つの部分が受信されました.2つは配信待ちですが、もう1つはDEL_FLG 'D'を設定するDeleteに要求されています。

TABLE1 
    ------------------------------------------------------ 
    CALLTICKET ORDERNO PART_NO RECEIVE_ETA DEL_FLG 
    123456  100900 ABC-123 09-02-2017  N 
    123456  100900 ABC-121 09-02-2017  N  
    123456  100900 ABC-456     D 
    123456  100900 ABC-697     N 
    123456  100900 ABC-852     N 

今、私はDEL_FLGである「D」が、部品の残りが配信されている、すなわちだけそれらDISTINCT CALLTICKETsを選択するビューを作成したい、RECEIVE_ETAは(現状ファーストのように)NULLではありません、 1つのPART_NOが削除されているが2つの部分の配信が保留されている状況2とは異なります。

私がVIEWまたは指定した条件のSELECTクエリの作成を手伝ってください。 ありがとう!あなただけcallticketsあなたが使用することができます集約が必要な場合は

+1

なぜストアドプロシージャが必要だと思いますか? –

+0

@a_horse_with_no_name - 彼はそうは思わない。私はPLを編集します。 – mathguy

+0

サンプルデータを目的の結果に追加すると役立ちます。 –

答えて

0

:あなたはcalltickets /少なくとも一つ削除された行を持って注文をしたいように見えるので、

select calltickets, orderno 
from table1 
group by calltickets, orderno 
having sum(case when receive_eta is null and del_flag = 'N' then 1 else 0 end) = 0 and 
     sum(case when del_flag = 'Y' then 1 else 0 end) > 0; 

第2の条件があります。

+1

これは 'DEL_FLG = D'の** no **行のcallticketsも返します。 OPの質問から、彼はそれらに興味がないようです。だから:明確化のために質問をすることができます。または、今すぐ撮影して質問をすることができます。 (または決して。)良くない! (「質問の時間は誰がいるの?」 – mathguy

0

このクエリでは、第1の状況の条件に一致するレコードを返すと、第2の状況の基準に一致するレコード除外されます:これは非常に効率的ではないかもしれません関与するレコードの数に応じて

select distinct callticket 
     , orderno 
from table1 
where del_flg = 'D' 
and (callticket, orderno) not in 
      (select callticket, orderno 
      from table1 
      where del_flg != 'D' 
      and receive_eta is null) 

を。しかし、本当に必要なのは、より良いデータモデルです。

0

NOT EXISTSを使用できます。

このクエリdel_flg = 'D' とすべてのRECEIVE_EXTAですべての行を返しますがNULLではありません

select * from table1 t1 where DEL_FLG = 'D' 
and not exists (select 1 from table1 t2 where (t2.callticket=t1.callticket and t2.RECEIVE_EXTA IS NULL); 

しかしdel_flg = 'D' を持つ複数のレコードがあるかもしれません。この場合、何が必要ですか?あなたが必要な場合は、単にあなたが知っている場合は、そのORDERNOがcallticketためのユニークであるように見えるように、あなたも、フィールドリストにそれを置くことができます

select distinct callticket from table1 t1 where DEL_FLG = 'D' 
and not exists (select 1 from table1 t2 where (t2.callticket=t1.callticket and t2.RECEIVE_EXTA IS NULL); 

で行うことができますcallticket。

しかし、あなたのニーズに応じて、クエリがより明確

0
  1. インナークエリになることも - DEL_FLG =「N」と(RECEIVE_ETAがnull)受信のレコードを確認してください。ここでは、関数ごとにmin関数を使用しています。最低受取日を選択します。 nullの場合、NVL関数は受信日 '1900-01-01'を割り当てます。少なくともレコードがヌル値の場合、それは '1900-01-01'に戻ります。
  2. 外部クエリ - 上記のクエリの助けを借りてDEL_FLG = 'D' を持つすべてのレコードをフェッチし、すべてのレコードが

    受信されるTABLE1 A、 (CALLTICKETを選択 MINは異なるA.CALLTICKET を選択DEL_FLG = 'N' GROUP BY CALLTICKET )B A.CALLTICKET = B.CALLTICKET AND A.DEL_FLG = 'D' TABLE1 FROM(NVL(RECEIVE_ETA、 '1900-01-01'))RECEIVE_ETA およびB.RECEIVE_ETA <> '1900-01-01'

これについてさらにヘルプが必要な場合は、お知らせください。

関連する問題