Как преобразовать строки в столбцы в SQL Server 2005 - PullRequest
6 голосов
/ 26 февраля 2010

В стеке потока есть вопрос с тем же названием, но это не то, что я ищу.
У меня есть таблица, подобная приведенной ниже

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

Мне нужно преобразовать этот набор результатов во что-то вроде этого

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

Как мне добиться этого с помощью SQL Server 2005?

Ответы [ 3 ]

5 голосов
/ 26 февраля 2010

Есть похожие вопросы здесь , здесь ответил в stackoverflow.

Вам нужно использовать оператор PIVOT в вашем запросе, чтобы добиться этого. Вот пример и объяснение того, как вы можете это сделать. Пример ссылается на это источник.

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

Объяснение

1. Первая часть запроса

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

дает вам хороший сплющенный результат значений вашего столбца Name в одной строке следующим образом

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

Вы можете узнать больше о STUFF и XML PATH здесь и здесь .

2. SELECT + @cols + FROM выберет все строки в качестве имен столбцов для окончательного набора результатов (pvt - шаг 3)

т.е.

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

3.Этот запрос извлекает все строки данных, которые нам нужны для создания результатов кросс-таблицы. (P) после запроса создает временную таблицу результатов, которую затем можно использовать для удовлетворения запроса на шаге 1.

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

4. Выражение PIVOT

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

выполняет фактическое суммирование и помещает результаты во временную таблицу с именем pvt как

Chery | Drew | Morgon | Kath | Kirk | Matt  
-------------------------------------------  
257     1500     13      500    200    76
2 голосов
/ 26 февраля 2010

См. Использование PIVOT и UNPIVOT .

Вы можете использовать PIVOT и UNPIVOT реляционные операторы, чтобы изменить табличное выражение в другое Таблица. PIVOT вращает табличное значение выражение путем превращения уникального значения из одного столбца в выражение в несколько столбцов в вывод и выполняет агрегации где они требуются на любом оставшиеся значения столбца, которые хотел в окончательном выводе. UNPIVOT выполняет противоположную операцию PIVOT вращающимися колоннами табличное выражение в столбце значения.

Быстрый ответ:

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 голосов
/ 14 февраля 2013

Если вы хотите избежать чего-либо сложного, например, разворота или принятого ответа, вы можете сделать это! (большая часть кода просто устанавливает тестовые данные на тот случай, если кто-то захочет их попробовать)

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

*/
...