类似的问题here,here在stackoverflow中有回答。
您需要在查询中使用运算符 PIVOT 来实现这一点。以下是有关如何执行此操作的示例和说明。该示例引用自 this 来源。
---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, '') + ']'
在单行中为您的 Name 列值提供一个很好的扁平化结果,如下所示
[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]
您可以详细了解 STUFF 和 XML PATH here 和 here。
2.SELECT + @cols + FROM 将选择所有行作为最终结果集的列名(pvt - 步骤 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 as 的临时表中
Chery | Drew | Morgon | Kath | Kirk | Matt
-------------------------------------------
257 1500 13 500 200 76