2016-07-25 7 views
1

Ich habe paar Spalten mit angegebenen Namen. Ich muss den Namen der Spalte auswählen, wo der angegebene Wert ist.SQL Server - Finden Sie den Namen cols durch den angegebenen Wert

Beispiel:

----------------------------------- 
id| a col | b col | c col | d col | 
----------------------------------- 
1 | N | N | A | N | 
2 | A | N | N | N | 
3 | N | A | N | N | 

I erhalten müssen führen wie

-------------------- 
id | column's name | 
-------------------- 
1 |  c col  | 
2 |  a col  | 
3 |  b col  | 

Es gibt mehr Spalten in der Tabelle sind, also muss ich Spalten festlegen, die dafür verwendet werden soll. Wie kann ich das in SQL Server 2014 tun?

+2

u schwenken oder Entpivotisierung https aussehen sollte: // technet .microsoft.com/nl-nl/library/ms177410 (v = sql.105) .aspx – lordkain

+0

Mögliches Duplikat von [SQL Server: retu rn Spaltennamen basierend auf dem Wert eines Datensatzes] (http://stackoverflow.com/questions/27285569/sql-server-return-column-names-based-on-a-records-value) – Lijo

+0

Speichern der gleichen "Art" von Daten in mehreren Spalten sind normalerweise ein Zeichen für ein fehlerhaftes Datenmodell - oft begleitet von einigen Ihrer * Daten *, die stattdessen als * Metadaten * enden - wie hier, wo Daten, in die Sie Abfragen schreiben möchten, in Spaltennamen eingebettet werden *. Es wäre besser, wenn möglich, das Datenmodell so zu fixieren, dass alle Daten * als Daten * modelliert werden. –

Antwort

0

UNPIVOT sollte genug sein:

SELECT id, 
     col 
FROM (
    SELECT * 
    FROM YourTable 
    ) as p 
UNPIVOT (
    [value] FOR col IN ([a col], [b col], [c col], [d col]) 
) as unpvt 
WHERE [value] = 'A' 

Ausgang:

id col 
1 c col 
2 a col 
3 b col 
0

Sie UNPIVOT Abfrage wie

unten verwenden können
declare @q varchar(max) 
set @q='select id,columnname from '+ 
'(select id,columnname,data from '+ 
'(select * from tablename)t '+ 
'UNPIVOT '+ 
'(data for columnname in ('+ 
stuff((select ',['+c.name +'] ' from sys.columns c join sys.tables t 
on c.object_id=t.object_id and t.name like 'tablename' FOR XML PATH('')),1,1,'') 
+')) u)t where data like ''A''' 
exec @q 
Verwandte Themen