2010-02-26 15 views
6

Es gibt eine question hier in Stackoverflow mit dem gleichen Titel, aber das ist nicht das, was ich suche.
Ich habe eine Tabelle wie die untenWie verwandle ich Zeilen in Spalten in SQL-Server 2005

Name | Count 
----------------  
Chery | 257 
Drew | 1500 
Morgon | 13 
Kath | 500 
Kirk | 200 
Matt | 76 

Ich brauche dieses Ergebnis in etwa so aus wie

Chery | Drew | Morgon | Kath | Kirk | Matt 
------------------------------------------- 
257  1500  13  500 200 76 

auf Transform do acheive ich diese mit SQL Server 2005?

Antwort

5

Es gibt ähnliche Fragen here, here in Stackoverflow beantwortet.

Sie müssen die Betreiber PIVOT in Ihrer Abfrage verwenden, um acheive this.Here ist das Beispiel und Erklärung, wie Sie that.The Beispiel tun können von this Quelle verwiesen wird.

---I assumed your tablename as TESTTABLE--- 
DECLARE @cols NVARCHAR(2000) 
DECLARE @query NVARCHAR(4000) 

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + t.Name 
         FROM TESTTABLE AS t 
         ORDER BY '],[' + t.Name 
         FOR XML PATH('') 
        ), 1, 2, '') + ']' 

SET @query = N'SELECT '+ @cols +' FROM 
(SELECT t1.Name , t1.Count FROM TESTTABLE AS t1) p 
PIVOT (MAX([Count]) FOR Name IN ('+ @cols +')) 
AS pvt;' 

EXECUTE(@query) 

Erklärung

1.Die erster Teil der Abfrage

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
         '],[' + t.Name 
       FROM TESTTABLE AS t 
       ORDER BY '],[' + t.Name 
       FOR XML PATH('') 
      ), 1, 2, '') + ']' 

gibt Ihnen ein schönes abgeflachte Ergebnis Ihrer Spalte Namen Werte in einer einzigen Zeile als

[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt] 
folgen

Sie können lea rn mehr über die STUFF und XML PATH here und here.

2. SELECT + @cols + FROM werden alle Zeilen als coloumn Namen für das Endergebnis Satz auswählen (pvt - Schritt 3)

d.h

Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt] 

3.Diese Abfrage ruft alle Datenzeilen ab, die zum Erstellen der Kreuztabellenergebnisse erforderlich sind. Die (p) nach der Abfrage wird eine temporäre Tabelle der Ergebnisse erstellen, die dann verwendet werden können, um die Abfrage für Schritt zu erfüllen 1.

(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p 

4.The pivot Ausdruck

PIVOT (MAX (Count) FOR Name IN (@cols) AS pvt 

führt die eigentlichen Zusammenfassung und stellt die Ergebnisse in eine temporäre Tabelle pvt als

Chery | Drew | Morgon | Kath | Kirk | Matt 
------------------------------------------- 
257  1500  13  500 200 76 
+0

+1, großartige Lösung und Antwort. Beachten Sie, dass die "TOP 100 PROZENT" in "TOP 30" oder was auch immer geändert werden kann, so dass Sie die Anzahl der Spalten nicht überschreiten, wenn Sie viele Zeilen haben. –

2

Siehe Using PIVOT and UNPIVOT.

können Sie verwenden, um die PIVOT und UNPIVOT relationalen Operatoren einen Tabellenwert Ausdruck in einer anderen Tabelle zu ändern. PIVOT dreht eine Tabellenwert Expression durch den einzigartigen Werte von einer Spalte in dem Expression in mehrere Spalten in die Ausgangsdreh und führt Aggregationen wo sie auf irgendwelchen verbleibenden Spaltenwerte erforderlich sind, die im endgültigen wollte Ausgabe. UNPIVOT führt die entgegengesetzte Operation zu PIVOT durch Drehen von Spalten eines Tabellenwertausdrucks in Spalte Werte.

Die schnelle Antwort ist

SELECT Chery, Drew, Morgon, Kath, Kirk, Matt 
FROM 
(SELECT [Name], [Count] From Foo) 
PIVOT 
(
    MIN([Count]) 
    FOR [Name] IN (Chery, Drew, Morgon, Kath, Kirk, Matt) 
) AS PivotTable 
0

Wenn Sie wie ein Drehpunkt vermeiden kompliziert etwas wollen oder die akzeptierte Antwort genannt, Sie können dies tun! (Der meiste Code ist nur das Einrichten der Testdaten nur für den Fall, dass jemand es versuchen möchte)

/* set up your test table */ 
declare @TestData table (Name Varchar(80),[Count] int)  
insert into @TestData (Name, [count]) 
Select 'Chery' as name, 257 as [count] 
union all select 'Drew', 1500 
union all select 'Morgon',13 
union all select 'Kath', 500 
union all select 'Kirk', 200 
union all select 'Matt', 76 

/* the query */ 
Declare @Query Varchar(max) 
Select @Query=Coalesce(@query+', ','SELECT ') +Convert(VarChar(5),[count]) +' as ['+name+']' 
from @TestData 
Execute (@Query) 
/* result 

Chery  Drew  Morgon  Kath  Kirk  Matt 
----------- ----------- ----------- ----------- ----------- ----------- 
257   1500  13   500   200   76 

*/ 
Verwandte Themen