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

Sam*_*Sam 6 sql sql-server pivot sql-server-2005

stackoverflow中有一个问题,标题相同,但这不是我要找的.
我有一张如下表所示的表格

Name   | Count  
----------------    
Chery  | 257  
Drew   | 1500
Morgon | 13  
Kath   | 500  
Kirk   | 200  
Matt   | 76 
Run Code Online (Sandbox Code Playgroud)

我需要将此结果集转换为这样的结果

Chery | Drew | Morgon | Kath | Kirk | Matt  
-------------------------------------------  
257     1500     13      500    200    76
Run Code Online (Sandbox Code Playgroud)

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

I A*_*ack 5

有类似的问题在这里,在这里的回答#.

您需要在查询中使用运算符PIVOT来实现此目的.是关于如何执行此操作的示例和说明.示例从此源引用.

---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)
Run Code Online (Sandbox Code Playgroud)

说明

1.查询的第一部分

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

在一行中为您提供名称列值的平滑结果,如下所示

[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]  
Run Code Online (Sandbox Code Playgroud)

您可以在此处此处了解有关STUFF和XML PATH的更多信息.

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

Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt] 
Run Code Online (Sandbox Code Playgroud)

3.此查询提取了创建交叉表结果所需的所有数据行.查询之后的(p)是创建结果的临时表,然后可以使用该表来满足步骤1的查询.

(SELECT t1.Name, t1.Count FROM  TESTTABLE AS t1) p
Run Code Online (Sandbox Code Playgroud)

4.PIVOT表达

PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt
Run Code Online (Sandbox Code Playgroud)

进行实际的汇总并将结果放入一个名为pvt as的临时表中

Chery | Drew | Morgon | Kath | Kirk | Matt  
-------------------------------------------  
257     1500     13      500    200    76
Run Code Online (Sandbox Code Playgroud)