如何在sql server 2005中将行转换为列

时间:2010-02-26 20:25:55

标签: sql sql-server sql-server-2005 pivot

stackoverflow中有一个question,标题相同,但这不是我想要的。
我有一个类似下面的表

Name   | Count  
----------------    
Chery  | 257  
Drew   | 1500
Morgon | 13  
Kath   | 500  
Kirk   | 200  
Matt   | 76 

我需要将此结果集转换为类似

的内容
Chery | Drew | Morgon | Kath | Kirk | Matt  
-------------------------------------------  
257     1500     13      500    200    76

我如何使用sql server 2005实现这一目标?

3 个答案:

答案 0 :(得分:5)

在stackoverflow中回答了类似的问题herehere

您需要在查询中使用运算符 PIVOT 来实现此目的。以下是有关如何执行此操作的示例和说明。示例引自 { {3}} 来源。

---I assumed your tablename as TESTTABLE---
DECLARE @cols NVARCHAR(2000)
DECLARE @query NVARCHAR(4000)

SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + t.Name
                        FROM    TESTTABLE AS t
                        ORDER BY '],[' + t.Name
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'

SET @query = N'SELECT '+ @cols +' FROM
(SELECT t1.Name , t1.Count FROM TESTTABLE AS t1) p
PIVOT (MAX([Count]) FOR Name IN ( '+ @cols +' ))
AS pvt;'

EXECUTE(@query)

解释

1.查询的第一部分

SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                        '],[' + t.Name
                FROM TESTTABLE AS t
                ORDER BY '],[' + t.Name
                FOR XML PATH('')
              ), 1, 2, '') + ']'

在单行中为您的“名称”列值提供了一个很好的展平结果,如下所示

[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]  

您可以详细了解STUFF和XML路径thishere

2. SELECT + @cols + FROM将所有行选为最终结果集的coloumn名称(pvt - step 3)

Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt] 

3.此查询提取我们创建交叉表结果所需的所有数据行。查询后的(p)创建结果的临时表,然后可用于满足步骤1的查询。

(SELECT t1.Name, t1.Count FROM  TESTTABLE AS t1) p

4.PIVOT表达

PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt

执行实际的摘要并将结果放入名为pvt的临时表中作为

Chery | Drew | Morgon | Kath | Kirk | Matt  
-------------------------------------------  
257     1500     13      500    200    76

答案 1 :(得分:2)

请参阅Using PIVOT and UNPIVOT

  

您可以使用PIVOTUNPIVOT   关系运算符改变一个   表值表达到另一个   表。 PIVOT旋转表值   通过转动独特的表达   来自一列中的值   表达成多个列   输出,并执行聚合   在任何地方都需要它们   剩下的列值   想要在最后的输出中。 UNPIVOT   执行相反的操作   通过旋转a的PIVOT   表值表达式到列中   值。

快速回答是

SELECT Chery, Drew, Morgon, Kath, Kirk, Matt
FROM 
(SELECT [Name], [Count] From Foo)
PIVOT
(
   MIN([Count])
   FOR [Name] IN (Chery, Drew, Morgon, Kath, Kirk, Matt)
) AS PivotTable

答案 2 :(得分:0)

如果你想避免像枢轴或接受的答案那样复杂的事情,你可以这样做! (大多数代码只是设置测试数据,以防万一有人想尝试)

/* set up your test table */
declare @TestData table (Name Varchar(80),[Count] int)    
insert into @TestData (Name, [count])
Select 'Chery' as name, 257 as [count]  
union all select 'Drew', 1500
union all select 'Morgon',13  
union all select 'Kath', 500  
union all select 'Kirk', 200  
union all select 'Matt', 76 

/* the query */
Declare @Query Varchar(max)
Select @Query=Coalesce(@query+', ','SELECT ') +Convert(VarChar(5),[count]) +' as ['+name+']'
from @TestData
Execute (@Query)
/* result 

Chery       Drew        Morgon      Kath        Kirk        Matt
----------- ----------- ----------- ----------- ----------- -----------
257         1500        13          500         200         76

*/