2013-02-01 17 views
15

Ich habe eine Gruppe von Zeilen in einer Tabelle, die eine ID haben. Ich versuche, es in Reihen mit mehreren Spalten zu reduzieren. Ich bin mir fast sicher, dass ich das mit einer Cte und vielleicht einer Partitionierung gemacht habe.versuchen, Zeilen in Spalten zu glätten

Ich habe Cte ​​verwendet, um doppelte Daten zu löschen, und ich dachte, ich habe etwas getan, was ich hier erreichen möchte. Ich war in der Lage, eine praktikable Lösung zu finden (siehe unten), habe aber immer noch das Gefühl, dass eine elegantere Lösung verfügbar sein sollte.

CREATE TABLE #MyTable (RowID int , field VARCHAR(10), value VARCHAR(10)) 

INSERT INTO #MyTable (RowID, field, value) VALUES (1, 'first', 'neil') 

INSERT INTO #MyTable (RowID, field, value) VALUES (2, 'first', 'bob' ) 

INSERT INTO #MyTable (RowID, field, value) VALUES (3, 'first', 'tom' ) 

INSERT INTO #MyTable (RowID, field, value) VALUES (1, 'last', 'young') 

INSERT INTO #MyTable (RowID, field, value) VALUES (2, 'last', 'dylan') 

INSERT INTO #MyTable (RowID, field, value) VALUES (3, 'last', 'petty') 

SELECT * FROM #mytable 

--trying dies mit CTE/partition zu erreichen:

SELECT rowid, 
    [first] = (Select value FROM #mytable where field = 'first' and rowid = t.rowid), 
    [last] = (Select value FROM #mytable where field = 'last' and rowid = t.rowid) 
FROM #mytable t 
GROUP BY rowid 

Antwort

19

Diese Datentransformation als PIVOT bekannt. In SQL Server 2005+ gibt es eine Funktion, die diesen Prozess ausführt. :

select * 
from 
(
    SELECT * 
    FROM mytable 
) src 
pivot 
(
    max(value) 
    for field in (first, last) 
) piv 

Siehe SQL Fiddle with Demo.

Oder Sie können eine Aggregatfunktion mit einem CASE Ausdruck verwenden:

select rowid, 
    max(case when field = 'first' then value end) first, 
    max(case when field = 'last' then value end) last 
from MyTable 
group by rowid 

SQL Fiddle with Demo See.

Sie auch auf Ihrem Tisch können mehrere verbindet:

select t1.rowid, 
    t1.value first, 
    t2.value last 
from mytable t1 
left join mytable t2 
    on t1.rowid = t2.rowid 
    and t2.field = 'last' 
where t1.field = 'first' 

Siehe SQL Fiddle with Demo

Das Ergebnis für alle Versionen gleich ist:

| ROWID | FIRST | LAST | 
------------------------- 
|  1 | neil | young | 
|  2 | bob | dylan | 
|  3 | tom | petty | 
+1

Vielen Dank. Der Pivot ist absolut das, wonach ich gesucht habe. Ich hatte das auch versucht, aber nicht mit dem Max(). Danke noch einmal. – boone

+0

@boone Sie sind herzlich willkommen! :) – Taryn

+0

sehr nützliche Funktion, danke – AlexFoxGill