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实现这一目标?
答案 0 :(得分:5)
在stackoverflow中回答了类似的问题here,here。
您需要在查询中使用运算符 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]
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)
您可以使用
PIVOT
和UNPIVOT
关系运算符改变一个 表值表达到另一个 表。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
*/