2010-02-26 11 views
6

Istnieje tutaj question tutaj w stackoverflow o tym samym tytule, ale to nie jest to, czego szukam.
Mam tabeli jak ten poniżejJak przekształcić wiersze w kolumny w serwerze sql 2005

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

muszę trasform ten zestaw wyników na coś takiego

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

Jak mogę acheive to przy użyciu serwera SQL 2005?

Odpowiedz

5

Istnieją podobne pytania here, here odpowiedzi stackoverflow.

trzeba użyć operatora PIVOT w zapytaniu do acheive this.Here jest przykład i wyjaśnienie, w jaki sposób można zrobić that.The przykład odwołuje się od this źródła.

---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 piękny spłaszczony wynik swoimi wartościami Nazwa kolumny w jednym rzędzie, jak postępować

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

Możesz lea więcej informacji na temat STUFF i XML PATH here i here.

2. SELECT + @cols + FROM wybrania wszystkich wierszy jak nazwy kolumnowej błyskawicznej do końcowego zbioru wyników (PVT - krok 3)

tj

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

3.Ta kwerenda pobiera wszystkie wiersze danych, które są potrzebne do utworzenia wyników w tabeli. (P) po zapytaniu tworzy tymczasowej tabeli wyników, które mogą być następnie wykorzystywane w celu zaspokojenia zapytanie w etapie 1.

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

4. Ekspresja ObROTOWE

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

się właściwy podsumowania i umieszcza wyniki w tabeli tymczasowej nazwie Pvt jak

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

+1, świetne rozwiązanie i odpowiedź. Uwaga: "TOP 100 PERCENT" można zmienić na "TOP 30" lub cokolwiek innego, więc nie przekraczasz liczby kolumn, jeśli masz dużo wierszy. –

2

Zobacz Using PIVOT and UNPIVOT.

Można użyć PIVOT i UNPIVOT operatorów relacyjnych zmienić wyraz wycenione tabela do innego tabeli. PIVOT obraca wycenione tabela wyraz obracając unikalne wartości z jednej kolumny w wyrażeniu w wielu kolumnach w wyjście i wykonuje agregacje gdzie są one wymagane na wszelkich pozostałych wartości kolumn, które są chciał w finale wydajność. UNPIVOT wykonuje operację przeciwną do PIVOT, obracając kolumny wyrażenia o wartości wyrażonej w tabeli o wartości do wartości kolumny .

Szybka odpowiedź

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

Jeśli chcesz uniknąć nic skomplikowanego jak przegubu lub zaakceptowanej odpowiedzi, możesz to zrobić! (większość kodu to po prostu konfiguracja danych testowych na wypadek, gdyby ktoś chciał to wypróbować)

/* 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 

*/ 
Powiązane problemy