2016-07-27 16 views
0

で競合しているレコードを持つ行を捨て、私は下に示すサンプルシナリオを思い付いた:SQL:より良い私の問題を説明するために1列

次は、顧客AとBザ・Open_Yearのための銀行口座履歴のリストですいくつかのアカウントが欠落しているか、他のレコードと競合しています。

例えば

A-3-UBアカウントリスト内の2つのレコードを持つ単一のアカウントを表し、ただし、2つの競合Open_Year 1990 & 2012を有します。アカウントA-1-BAには2つのレコードがあり、レコードの1つにOpen_Yearがありません。私が持っていると思いますがクエリを選択シングルている

Customer Account_id Bank_id Open_Year Gender 
     A   1  BA  2000  F 
     A   1  BA   .  F 

     A   2  UB   .  F 

     A   3  UB  1990  F 
     A   3  UB  2012  F 

     A   4  UB  2013  F 
     A   4  UB  2013  . 

     A   5  UB   .  F 

     B   1  WF  2014  M 
     B   1  WF  2014  . 

     B   6  WF   .  . 

、それらのアカウント行方不明/ Open_Yearが完了破棄されます矛盾のいずれかで、すなわち、戻り結果は次のようになります。

Customer Account_id Bank_id Open_Year Gender 
     A   4  UB  2013  F 
     A   4  UB  2013  . 
     B   1  WF  2014  M 
     B   1  WF  2014  . 

追加質問:

最後に別のレコードが追加されました。さらに、Gen DERは矛盾や不足している少なくとも1つの値、Open_Yearの場合と同じ要件です:

Customer Account_id Bank_id Open_Year Gender 
     A   1  BA  2000  F 
     A   1  BA   .  F 

     A   2  UB   .  F 

     A   3  UB  1990  F 
     A   3  UB  2012  F 

     A   4  UB  2013  F 
     A   4  UB  2013  . 

     A   5  UB   .  F 

     B   1  WF  2014  M 
     B   1  WF  2014  . 

     B   6  WF   .  . 

     C   7  WB  2015  F 

予想される出力は次のようになります。

Customer Account_id Bank_id Open_Year Gender 
     C   7  WB  2015  F 

答えて

1

また、あなたがして、グループを使用して、次のように持つことができます:

with a(Customer,Account_id,Bank_id,Open_Year,Gender) as (
select  'A'  , '1' , 'BA' , 2000,  'F' from dual union all 
select  'A'  , '1' , 'BA' , null , 'F' from dual union all 
select  'A'  , '2' , 'UB' , null , 'F' from dual union all 
select  'A'  , '3' , 'UB' , 1990 , 'F' from dual union all 
select  'A'  , '3' , 'UB' , 2012 , 'F' from dual union all 
select  'A'  , '4' , 'UB' , 2013 , 'F' from dual union all 
select  'A'  , '4' , 'UB' , 2013 ,  null from dual union all 
select  'A'  , '5' , 'UB' , null , 'F' from dual union all 
select  'B'  , '1' , 'WF' , 2014 , 'M' from dual union all 
select  'B'  , '1' , 'WF' , 2014 ,  null from dual union all 
select  'B'  , '6' , 'WF' , null ,  null from dual union all 
select  'C'  , '7' , 'AC' , 2016,  'F' from dual) 
select a.* 
    from a 
where (account_id, bank_id, Open_Year) in 
     (select account_id, bank_id , Open_Year 
      from a 
      group by account_id, bank_id , Open_Year 
     having count(*) > 1) 

    or customer in (select customer from a group by customer having count(*) = 1) 
+0

返されるエラーは次のとおりです。サブクエリは複数の列を選択できません。 –

+0

私はそれをoracle 11gと10xeでテストしました(10xeでいくつかのエイリアスを修正する必要があります)。サブクエリに関するエラーはありません。 –

+0

もう一度テストしましたが、サンプルデータセットではうまく機能しました!もう1つ質問:1つのクエリで同時に2つの列(「Open_Year」、「Gender」)をフィルタリングすることは可能ですか? –

1

あなたは、この使用してウィンドウ関数を行うことができます。

select t.* 
from (select t.*, 
      count(distinct open_year) over (partition by account_id, bank_id) as cntd_oy, 
      count(*) over (partition by account_id, bank_id) as cnt, 
      count(open_year) over (partition by account_id, bank_id) as cnt_oy 
     from t 
    ) t 
where cntd_oy = 1 and cnt = cnt_oy 
+0

これはうまく動作しますが、ゴルダンここでの一つの方法です。ありがとう! –

+0

@YMing。 。 。この回答を受け入れられない理由はありますか? OPとして、好きな答えを受け入れることができますが、なぜ私は好奇心が強いのですか? –

+0

@YMingさらに3つのカウンターが必要です。すべて、ヌルではなく、別個です。 – shawnt00

関連する問題