这里有类似的问题在这里,在这里在stackoverflow上得到了解答。
您需要在查询中使用运算符PIVOT来实现这一点。以下是示例和说明,说明如何做到这一点。该示例引用自此处资源。
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]
你可以在
这里和
这里了解有关STUFF和XML PATH的更多信息。
2.
SELECT + @cols + FROM
将选择所有行作为最终结果集(pvt - step 3)的列名。
i.e
Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt]
3. 这个查询检索出我们需要创建交叉表结果的所有数据行。查询之后的(p)创建了一个临时表格,可以用来满足第一步查询的需求。
(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
TOP 100 PERCENT
可以更改为TOP 30
或其他数字,以避免在有大量行的情况下超出列数限制。 - KM.