如何在SQLServer2005中将行转换为列
stackoverflow中有一个标题相同,但这不是我想要的。如何在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 -----------------
我有一张和下面一样的桌子
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
*/