如何在SQLServer2005中将行转换为列

如何在SQLServer2005中将行转换为列,sql,sql-server,sql-server-2005,pivot,Sql,Sql Server,Sql Server 2005,Pivot,stackoverflow中有一个标题相同,但这不是我想要的。 我有一张和下面一样的桌子 Name | Count ---------------- Chery | 257 Drew | 1500 Morgon | 13 Kath | 500 Kirk | 200 Matt | 76 我需要将这个结果集转换成这样的东西 Chery | Drew | Morgon | Kath | Kirk | Matt -----------------

stackoverflow中有一个标题相同,但这不是我想要的。
我有一张和下面一样的桌子

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实现此目标?

请参阅

您可以使用
PIVOT
UNPIVOT
用于更改 将表值表达式转换为另一个 桌子<代码>透视旋转表值 通过旋转独特的 中一列中的值 将表达式转换为中的多列 输出,并执行聚合 在任何情况下都需要它们 剩余的列值是 在最终输出中需要<代码>取消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

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

您需要在查询中使用运算符,以实现此目的。以下是有关如何实现此目的的示例和说明。示例引用自源代码

---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]  
您可以了解更多有关内容和XML路径的信息。

2.
SELECT+@cols+FROM
将选择所有行作为最终结果集的列名(pvt-步骤3)

i、 e

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

(SELECT t1.Name, t1.Count FROM  TESTTABLE AS t1) p
4.轴心表达式

PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt
进行实际汇总,并将结果放入名为pvt的临时表中

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

如果你想避免任何复杂的事情,如支点或公认的答案,你可以这样做!(大部分代码只是设置测试数据,以防有人想尝试)


+很好的解决方案和答案。注意,
TOP 100%
可以更改为
TOP 30
或其他任何内容,因此如果行太多,则不会超过列数。
Chery | Drew | Morgon | Kath | Kirk | Matt  
-------------------------------------------  
257     1500     13      500    200    76
/* 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

*/