2016-07-27 9 views
3

異なる行全体で複数の列の間で重複した値を探します。たとえば、これは私が上から戻って取得したいのですが何をされていますは、私は次のようになり、複数の列を持つデータセットを持っている

ID  Replicates 
Blue 3  
Black 1  
Green 3  
Pink 2 
Grey 1 
Yellow 2 
Fuchsia 1 
Orange 2 

私はまた、値は、周波数> 2に設定されたデータ中に存在するID尋ねることができるようにしたいと思います。予想される結果は、緑と青です。

オラクルでこれを行う方法についてのご意見はありますか?ありがとう!

答えて

3
select c, count(*) 
from 
(
select ID1 as c from tablename 
union all 
select ID2 as c from tablename 
union all 
select ID3 as c from tablename 
union all 
select ID4 as c from tablename 
) 
group by c 

最後にHAVING count(*) > 2を追加すると、緑色と青色のみが得られます。

+0

ありがとうございました!上記のクエリは、 "as dt"がクエリから削除された場合に機能します。それ以外の場合、「SQLコマンドが正しく終了していません」というエラーが表示されます。また、このクエリのロジックを説明できますか? –

+0

として「dt」が削除されました。 (ANSI SQLですが、Oracleはそれを好まない...)サブクエリ(派生テーブル)は、単にすべてのデータを1つの列として返します。 GROUP BYはカウントを行うためのものです。 (HAVINGは結果を2回以上表示される色のみに制限するために使用されます)。 – jarlh

1
SELECT ID, COUNT(*) FROM(
SELECT ID1 ID FROM TBL UNION ALL 
SELECT ID2 ID FROM TBL UNION ALL 
SELECT ID3 ID FROM TBL UNION ALL 
SELECT ID4 ID FROM TBL) Q 
GROUP BY Q.ID; 
1
select id, sum(id_cnt) 
(select ID1 as ID,count(*) as id_cnt from tableA group by ID1 
union all 
select ID2,count(*)from tableA group by ID2 
union all 
select ID3,count(*)from tableA group by ID3 
union all 
select ID4,count(*)from tableA group by ID4) 
group by id 

Outpoutは

ID  Replicates 
Blue 3  
Black 1  
Green 3  
Pink 2 
Grey 1 
Yellow 2 
Fuchsia 1 
Orange 2 
1

のようになります。ここでは、Oracleのunpivotキーワード使用して別の非常に単純明快なオプションです:あなたは、

select id, count(*) as replicates 
from tbl 
unpivot 
(
    id for original_column_name in (id1, id2, id3, id4) 
) 
group by id 

...そしてもちろんをお好きなようにhavingおよび/またはorder by句を追加できます。

関連する問題