2016-07-27 8 views
3

ich einen Datensatz mit mehreren Spalten haben, die wie folgt aussehen:Finden Sie doppelte Werte zwischen mehreren Spalten in den verschiedenen Reihen

ID1  ID2  ID3  ID4 
Blue Grey Fuchsia Green 
Black Blue Orange Blue 
Green Green Yellow Pink 
Pink Yellow NA  Orange 

Was ich tun möchte, ist zu zählen, wie oft jeder Wert über die vier Spalten dupliziert . Zum Beispiel ist es das, was ich würde wieder von oben zu bekommen:

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

Ich würde auch vorhanden ist, in dem bei der Frequenz eingestellt, welchem ​​Daten-ID-Wert in der Lage sein möge fragen> 2. Das erwartete Ergebnis wäre also: Grün und Blau.

Irgendwelche Gedanken, wie man das in Oracle macht? Vielen Dank!

Antwort

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 

Fügen Sie HAVING count(*) > 2 am Ende hinzu, um nur Grün und Blau zu erhalten.

+0

Danke! Die obige Abfrage funktioniert, wenn "as dt" aus der Abfrage entfernt wird. Andernfalls wird der Fehler "SQL-Befehl nicht ordnungsgemäß beendet" angezeigt. Kannst du auch die Logik dieser Abfrage erklären? –

+0

'als dt' entfernt. (ANSI SQL, aber Oracle mag es nicht ...) Die Unterabfrage (eine abgeleitete Tabelle) gibt einfach alle Daten als eine Spalte zurück. Die GROUP BY ist für das Zählen zuständig. (Mit HAVING wird das Ergebnis auf nur mehr als zwei Farben beschränkt.) – 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 wird

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

hier ähnlich sein eine andere ist sehr straight-forward Option unpivot Keywords mit Oracle:

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

... und natürlich, Sie kann eine having und/oder order by Klausel hinzufügen, wie Sie bitte.

Verwandte Themen