Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak przekształcić wiersze w kolumny w serwerze sql 2005?

Są podobne pytania tutaj ,tutaj odpowiedział w stackoverflow.

Musisz użyć operatora PIVOT w zapytaniu, aby to osiągnąć. Oto przykład i wyjaśnienie, jak możesz to zrobić. Odwołanie do przykładu pochodzi z to źródło.

---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)

Wyjaśnienie

1. Pierwsza część zapytania

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

daje ładny spłaszczony wynik wartości kolumny Nazwa w jednym wierszu, jak następuje

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

Więcej informacji o STUFF i XML PATH znajdziesz tutaj i tutaj .

2.SELECT + @cols + FROM wybierze wszystkie wiersze jako nazwy kolumn dla końcowego zestawu wyników (pvt - krok 3)

czyli

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

3. To zapytanie pobiera wszystkie wiersze danych, których potrzebujemy, aby utworzyć wyniki z tabeli krzyżowej. (p) po zapytaniu tworzy tymczasową tabelę wyników, której można następnie użyć do spełnienia zapytania z kroku 1.

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

4.Wyrażenie PIVOT

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

dokonuje faktycznego podsumowania i umieszcza wyniki w tymczasowej tabeli o nazwie pvt jako

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Odpytywanie połączonego serwera sql

  2. T-SQL:usuwanie wszystkich zduplikowanych wierszy, ale zachowanie jednego

  3. Node.js MSSQL tedius ConnectionError:nie udało się połączyć z hostem lokalnym:1433 - połącz ECONNREFUSED

  4. Zapytanie o liczbę rekordów w każdej tabeli w bazie danych

  5. Podłączanie Delphi w systemie Linux do SQL Server