Извините, я знаю, что подобный вопрос задавался много раз раньше, но, как и большинство других, я не смог найти тот, который соответствует тому, что мне нужно, или дает мне достаточно информации, чтобы можно было расширить ее до решения.
Я подозреваю, что мог бы использовать команды T-SQL PIVOT или UNPIVOT, но я не могу следовать объяснению MSDN, и, похоже, нет никаких руководств типа "идиотов"!
К моей проблеме - мне нужно преобразовать широкую таблицу, состоящую из множества столбцов, в набор результатов на основе строк для отчета. Агрегирование не требуется, и я стараюсь избегать повторного выбора на основе UNION, если это возможно.
Набор результатов таблицы отформатирован как таковой (на самом деле столбцов персонажей гораздо больше!: S):
Person1 | Person2 | Person3 | Person4 | Person5 | Person6 | Person7 | Person8
-----------------------------------------------------------------------------
Bob Sam Tom Alex Paul Ann Jill Jane
Что мне действительно нужно, так это чтобы я мог производить следующее:
Person
--------------------
Bob
Sam
Tom
Alex
Paul
Ann
Jill
Jane
Бонус сможет создать набор результатов, например:
Column Person
--------------------
Person1 Bob
Person2 Sam
Person3 Tom
Person4 Alex
Person5 Paul
Person6 Ann
Person7 Jill
Person8 Jane
Как этого добиться с помощью T-SQL в SQL Server 2005?
Спасибо за любую помощь,
Paul.
- Edit -
Благодаря Мартину я узнал что-то новое этим утром, и мне удалось получить именно то, что мне было нужно. В конце концов мне пришлось немного изменить пример, чтобы получить то, что мне нужно, но это потому, что в моем исходном примере были упущены некоторые детали, которые я не осознавал, будет важно!
Мой последний фрагмент кода выглядел следующим образом для всех, у кого была такая проблема:
WITH Query_CTE([Person1 Title],[Person2 Title],[Person3 Title])
AS
--CTE Expression and column list
(
SELECT
--Converted to create a common data type.
CONVERT(NVARCHAR(MAX),Person1Title) AS 'Person1 Title',
CONVERT(NVARCHAR(MAX),Person2Title) AS 'Person2 Title',
CONVERT(NVARCHAR(MAX),Person3Title) AS 'Person3 Title'
FROM Table_Name
WHERE KeyId = 'XXX'
)
SELECT *
FROM Query_CTE
UNPIVOT
(Person FOR [Column] IN
(
[Person1 Title],
[Person2 Title],
[Person3 Title]
)
)AS unpvt;