Существует вопрос здесь в 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?
Есть похожие вопросы здесь, , здесь, ответы в 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
См. Использование 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