sql - 另一个将行转列的问题 - SQL Server 2005

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

抱歉,我知道类似的问题以前被问过很多次,但像大多数人一样,我一直没能找到适合我需要的问题,也没有给我足够的信息来扩展解决方案。

我怀疑我可以使用 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

如何在 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;

最佳答案

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

关于sql - 另一个将行转列的问题 - SQL Server 2005,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5737328/

相关文章:

sql-server - 使用存储过程中的位输入来确定如何过滤where子句中的结果

sql-server - T-SQL 中的 CPU 时间与运行时间

tsql - T-SQL 计算具有特定值的行(一个查询中的多个)

sql - 区分列并在 postgres 中查找过去几个月的总和

mysql - mySql 存储过程的语法错误

sql - SQL:如何基于最大日期时间为多个ID选择单个记录?

sql - 对 SQL Server 2005 结果进行分页

sql-server - 将逗号分隔的字符串转换为要在 "IN"SQL 中使用的整数

sql - App=EntityFramework 在Sql 连接字符串中做了什么?

sql - 当确定它们存在于一个表中时,如何从两个表而不是一个表中获取行