Wo Case Statement Ärger

Ich habe einen SQL server 2003 Tisch, sagen wir "Alpha", mit drei Spalten. Sie sind [ID], [col1] und [col2].

id|col1|col2 1 |X |john1X| 1 |Y |john1Y| 1 |Z |john1Z| 2 |X |john2| 3 |Y |john3| 4 |X |john4| 

Jede ID kann mehrere Einträge haben. Wenn col1 'X' enthält, würde ich gern diese Zeile angezeigt. Wenn es keine ID mit 'X' in col1 gibt, würde ich 'Y' gewählt haben. Ansonsten sollte die Reihe überhaupt nicht kommen.

Für die obigen Beispieldaten wäre die erwartete Ausgabe unterhalb.

 id|col1|col2 1 |X |john1X| 2 |X |john2| 3 |Y |john3| 4 |X |john4| 

Ich habe versucht, diesen Code zu arbeiten, um zu arbeiten,

 select * from alpha where col1 = case when exists(select * from alpha where col1 = 'X') then 'X' else 'Y' end 

aber ich bekomme immer die untenausgabe egal wie ich den Code umschreibe.

 id|col1|col2 1 |X |john1X 2 |X |john2 4 |X |john4 

Sie fehlen eine Klausel in Ihrer Unterabfrage … Die Zeile

  when exists(select * from alpha where col1 = 'X') then 'X' 

sollte sein

 when exists(select * from alpha b where col1 = 'X' and b.id = alpha.id ) then 'X' 

Beachten Sie, dass ich der Tabelle in Ihrer Unterabfrage einen Alias ​​hinzugefügt habe, damit Sie mit den Haupttabellen mit den ID-Feldern der Unterabfrage-Tabelle übereinstimmen können.

Sie können dies mit row_number() :

 select a.* from (select a.*, row_number() over (partition by id order by col1 ) as seqnum from alpha where col1 in ('X', 'Y') ) a where seqnum = 1; 

Anmerkung: Diese spezielle Logik funktioniert wie angegeben, weil 'X' <'Y'. Sie können eine case statement für allgemeinere Bestellung oder mehr Werte verwenden.