Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie wandle ich zeilen in spalten in sql server 2005 um

Ähnliche Fragen gibt es hier , hier im Stapelüberlauf beantwortet.

Sie müssen den Operator PIVOT verwenden in Ihrer Abfrage, um dies zu erreichen. Hier ist das Beispiel und eine Erklärung, wie Sie das tun können. Auf das Beispiel wird verwiesen von hier Quelle.

---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.Der erste 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 nettes abgeflachtes Ergebnis Ihrer Name-Spaltenwerte in einer einzelnen Zeile wie folgt

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

Weitere Informationen zu STUFF und XML PATH finden Sie hier und hier .

2.SELECT + @cols + FROM wählt alle Zeilen als Spaltennamen für die endgültige Ergebnismenge aus (pvt - Schritt 3)

d.h.

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

3.Diese Abfrage ruft alle Datenzeilen ab, die wir zum Erstellen der Kreuztabellenergebnisse benötigen. Das (p) nach der Abfrage erstellt eine temporäre Tabelle der Ergebnisse, die dann verwendet werden kann, um die Abfrage für Schritt 1 zu erfüllen.

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

4.Der PIVOT-Ausdruck

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

führt die eigentliche Zusammenfassung durch und legt die Ergebnisse in einer temporären Tabelle namens pvt als

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