另一个转置行到列问题 - SQL Server 2005

时间:2011-04-20 22:20:36

标签: sql sql-server-2005 tsql stored-procedures

很抱歉,我之前已经多次询问过类似的问题,但是大多数情况下我找不到符合我需要的问题,或者给了我足够的信息以便能够扩展到解决方案。

我怀疑我可以使用T-SQL的PIVOT或UNPIVOT命令但是我不能按照MSDN解释那里似乎没有任何“idiots”类型指南!

在我的问题上 - 我需要将包含许多列的宽表转换为基于行的报表结果集。不需要聚合,如果可能的话,我试图避免重复的基于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

如何在SQL Server 2005中使用T-SQL实现这一目标?

感谢您的帮助,

保罗。

- 编辑 -

感谢Martin,我今天早上学到了一些东西,我已经设法得到了我需要的东西。最后我不得不稍微修改一下这个例子来得到我需要的东西,但那是因为我的原始例子遗漏了一些我没有意识到的重要细节!

对于遇到此类问题的其他人,我的最后一段代码看起来像这样:

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 个答案:

答案 0 :(得分:3)

WITH T(Person1,Person2 /* etc....*/) AS
(
SELECT 'Bob','Sam' /* etc....*/
)
SELECT *
FROM T
UNPIVOT
   (Person FOR [Column] IN 
      (Person1,Person2 /* etc....*/)
)AS unpvt;

答案 1 :(得分:0)

要轻松地将列转换为具有其名称的行,您应该使用XML。在我的博客中,我通过示例对此进行了描述:http://sql-tricks.blogspot.com/2011/04/sql-server-rows-transpose.html