抱歉,我知道类似的问题以前被问过很多次,但像大多数人一样,我一直没能找到适合我需要的问题,也没有给我足够的信息来扩展解决方案。
我怀疑我可以使用 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/