2017-11-11 4 views
1

こんにちは私はこのテーブルを持っていて、すべての行に共通のエントリ(ログID)を照会したいと思います。
すべての行に共通のエントリだけを選択してください

Log Id Person Id Main(Y/N) Sex Rel  
    01   21 Y   M  ATH  
    02   21 Y   M  ATH  
    03   21 Y   F  ATH  
    04   21 Y   M  ATH  
    05   21 Y   F  ATH  

期待される結果は次のようになります:

PersonId Y/N Sex Rel  
    21 Y  - ATH  

あなたは、私がそうでない場合はnull、唯一全ての行に共通するものを見せたかった参照してください。これは本当に複雑なクエリの一部にすぎません。以下は大きな問題です。

Log Id Person Id Main(Y/N) Sex Rel  
    01   21 Y   M  ATH  
    02   21 Y   M  ATH  
    03   21 Y   F  ATH  
    04   21 Y   M  ATH  
    05   21 Y   F  ATH  
    01   22 N   M  ATH  
    02   22 N   M  ATH  
    03   22 N   M  ATH  
    04   22 N   M  ATH  
    05   22 N   M  ATH  

期待される結果は次のようになります:

PerId Y/N S Rel  
    21 Y - ATH  
    22 N M ATH  
+0

あなたは '22'に' Y'と 'N'を両方持っています。なぜ22に 'N'が含まれるのでしょうか? –

答えて

1

次のクエリは動作するはずです:

select personId, 
     (case when count(distinct main)>1 then '' else main end) as Main, 
     (case when count(distinct sex) >1 then '' else sex end) as Sex, 
     (case when count(distinct religion)>1 then '' else religion end) as Religion 
from yourTableName 
group by personId; 

結果:

personId | Main | Sex | Religion 
    21  | Y |  | ATH 
    22  | N | M | ATH 

Click here for DEMO

Oracleソリューション:(@MarmiteBomberによって示唆されるように)

select personId, 
     (case when count(distinct main)=1 then max(main) else ' ' end) as Main, 
     (case when count(distinct sex)=1 then max(sex) else ' ' end) as Sex, 
     (case when count(distinct religion)=1 then max(religion) else ' ' end) as Religion 
from t 
group by personId; 

DEMO in Oracle

はそれが役に立てば幸い!

+0

personId以外の列に対してGROUP BY式が表示されない –

+0

MySQLを使用していますか? –

+1

@TribensonAzupardo for 'Oracle'では、集計関数、例えば 'MAX'または' MIN'を使用して列を囲む必要があります。例えば。 'count(別名メイン)> 1の場合はNULL、それ以外は最大(メイン)end' –

0

私はこのように記述します。

select personId, 
     (case when min(main) = max(main) then max(main) end) as Main, 
     (case when min(sex) = max(sex) then max(sex) end) as Sex, 
     (case when min(religion) = max(religion) then max(religion) end) as Religion 
from yourTableName 
group by personId; 

注:これは、未知の値をNULLを使用しています。私はこれがSQLと一線を画していると思います。本当にハイフンが必要な場合は、else '-'を使用できます。

count(distinct)の代わりにmin()max()を使用する理由は?理由は簡単です:パフォーマンス。 count(distinct)は、他の集計演算より高価です(中間結果にはすべての値のリストが格納されているため)。

+0

ありがとうございました。私は1つの質問を持っています:10-15の宗教を持つ多くの人の人がいるとします。このシナリオでもmin()とmax()はcount()よりも安いですか? –

+1

@ Harshil。 。 。 'min()'と 'max()'は* 'count(distinct)' *より高速です。問題は「別個」です。はい、特に行が多い場合はそうです。 –

関連する問題