Как я преобразовываю строки в столбцы в SQL-сервере 2005

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

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

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

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

Как я достигаю этого SQL-сервера использования 2005?

6
задан Community 23 May 2017 в 10:24
поделиться

2 ответа

Есть похожие вопросы здесь, , здесь, ответы в 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
5
ответ дан 17 December 2019 в 00:08
поделиться

См. Использование 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
2
ответ дан 17 December 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: