2016-08-09 48 views
0

Ich habe eine Abfrage, die etwa 10 Spalten zurückgibt. Die zweite Spalte der Abfrage-Ausgabe enthält doppelte Datensätze. Aber wenn es möglich ist, brauche ich, dass sie eindeutig ist, oder doppelte Datensätze nur für die zweite Spalte leer lassen.SELECT DISTINCT auf eine Spalte oder doppelte Einträge _blank, während andere Spalten

meine Daten sieht etwas wie das

HotelID ChainID 
1041  10 
1099  9 
1297  10 
1743  9 
2000  10 
241  10 

Die erforderliche ouput

HotelID ChainID 
1041 10 
1099 9 
1297  
1743  
2000  
241  

sein sollte, ich habe

Select Distinct id, val1 
FROM table1 where active=0 

Ich habe auch versucht Group By aber dasselbe Ergebnis mit.

Danke für die Hilfe!

+0

Die Gruppe würde die Werte nicht schwarz, sondern gruppieren sie, dann ist es an Ihnen, wenn die Werte zu lesen, um zu verfolgen, so dass Sie kann „leer“ aus der Duplikate. – juharr

+0

@GiladGreen: nur SQL. aber wenn möglich mit C# dann kann ich auch mit C# versuchen. –

+0

Das sieht komisch aus. Sie möchten ein Ergebnis mit zwei Spalten. Sie zeigen verbundene Hotels und Ketten. Aber warum interessiert Sie das Hotel 1041 der Kette 10 (und nur, weil dieses Hotel zufällig das erste ist), aber nicht an Hotel 1297 interessiert ist? Für mich scheint es, als wollten Sie überhaupt keine Beziehungen sehen, sondern zwei Fragen: eine, um Ihnen verschiedene Hotels zu geben, und eine, um Ihnen bestimmte Ketten zu geben. Mach diese eine Abfrage nicht; Es scheint keinen Sinn zu ergeben. –

Antwort

1

Bitte führen Sie die unten Abfrage den Wert, den es zu erhalten wird Ihren Bedarf voll erfüllen.

select hotelid,case when row_number()over(partition by ChainID order by HotelID)=1 then chainid else null end as ChainID from table1 where active=0 

aus

setzen
hotelid ChainID 
1099  9 
1743  NULL 
241  10 
1041  NULL 
1297  NULL 
2000  NULL 
+0

Vielen Dank!Holen Sie sich das genaue Ergebnis :) –

+0

können Sie bitte die Abfrage und das Ergebnis erklären? –

+1

Dies ist Gordons Abfrage komprimiert. Erläuterung: Die Datensätze werden pro ChainID nummeriert. Daher gibt es immer einen Datensatz pro ChainID mit der Nummer 1, dann möglicherweise weitere mit der Nummer 2, 3 und so weiter. Mit dem case-Ausdruck zeigen wir nur die ChainID für die Datensätze an, die die Nummer 1 erhalten haben. Daher wird jede ChainID nur einmal angezeigt. –

1

Sie können diese row_number() mit tun:

select t.HotelId, 
     (case when seqnum = 1 then ChainId end) as ChainId 
from (select t.*, 
      row_number() over (partition by chainId order by (select null)) as seqnum 
     from t 
    ) t; 
+0

Danke aber, Es gibt alle Zeilen von ChainID als NULL zurück, aber ich will nur Duplikate vermeiden. –

+0

@Rahul Hendawe: Fügen Sie 'order by seqnum' hinzu, um die Chainids oben zu sehen. –

+0

@ThorstenKettner: Ich bekomme 10 Zeilen, damit ich das Ergebnis deutlich sehen kann, alle Spaltenwerte sind 'NULL'. Tut mir leid, dass ich vergessen habe, 'WHERE' in der SQL-Abfrage hinzuzufügen. Bitte überprüfen Sie' WHERE Active = 0'. –

1

Diese Abfrage scheint nicht viel Sinn zu machen, als zwei Spalten eine Beziehung darstellen. Nun, wenn Sie alle Daten in einer Abfrage auswählen wollen, Zeit sparen irgendwie, können Sie diese stattdessen:

select distinct 'chain' as what, chainid as id from mytable 
union all 
select distinct 'hotel' as what, hotelid as id from mytable 
order by what, id; 

Geben Sie:

 
what id 
----- ---- 
chain 9 
chain 10 
hotel 241  
hotel 1041 
hotel 1099 
hotel 1297  
hotel 1743  
hotel 2000  
+0

Danke, das funktioniert! aber ich brauche eine Ausgabe im Tabellenformat. Können Sie bitte die Abfrage so ändern, dass die Ausgabe als Erwähnung angezeigt wird? –

+0

Ich würde dann die gleiche Technik wie Gordon Linoff verwenden. Meine Anfrage würde nicht von seiner abweichen. –