2011-04-20 71 views
3

对不起,我知道类似的问题已经被问了很多次,但以前最喜欢的我一直没能找到一个适合我的需要,也不给我足够的信息,以便能够列向解决方案扩展。另一个转行question- SQL Server 2005的

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

什么是您的select语句看起来像与人列的第一个结果:在我的博客,我用例子来解释? – Spidy 2011-04-20 22:28:22

+0

我还没有 - 只是基于宽表的选择。我需要去的任何一种后两种基于行的例子 – Paul 2011-04-20 22:48:39

回答

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

马丁您好,感谢这个答案这么快,但我可以向你解释了一点给我,让我能学到的原则落后吗? 现在英国的午夜在这里,所以我要睡觉了,但我会在早晨第一时间给它一个旋风,但我很想了解基本知识。 此致敬意, 保罗 – Paul 2011-04-20 22:45:41

+1

对于表'T'中的每一行它将返回2(或8或任何)输出行。 'Person'和'[Column]'分别是未转义列的值及其名称的列别名。没有其他的事要说真的!如果表'T'有额外的列没有指定为unpivot的一部分,这些将出现2次或8次或其他。 – 2011-04-20 22:59:23

+0

非常感谢,经过一番修改之后,我得到了我所需要的东西 - 我也为这个问题添加了最终解决方案。 – Paul 2011-04-21 09:25:48