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实现这一点?
您需要在查询中使用运算符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)