Еще один вопрос переноса строк в столбцы - SQL Server 2005 - PullRequest
3 голосов
/ 21 апреля 2011

Извините, я знаю, что подобный вопрос задавался много раз раньше, но, как и большинство других, я не смог найти тот, который соответствует тому, что мне нужно, или дает мне достаточно информации, чтобы можно было расширить ее до решения.

Я подозреваю, что мог бы использовать команды 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;

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011
WITH T(Person1,Person2 /* etc....*/) AS
(
SELECT 'Bob','Sam' /* etc....*/
)
SELECT *
FROM T
UNPIVOT
   (Person FOR [Column] IN 
      (Person1,Person2 /* etc....*/)
)AS unpvt;
0 голосов
/ 21 апреля 2011

Чтобы легко перенести столбцы в строки с их именами, вы должны использовать XML.В моем блоге это было описано на примере: http://sql -tricks.blogspot.com / 2011/04 / sql-server-row-transpose.html

...