SQL Server 2008 R2 使用 PIVOT 和 varchar 列不起作用

Posted

技术标签:

【中文标题】SQL Server 2008 R2 使用 PIVOT 和 varchar 列不起作用【英文标题】:SQL Server 2008 R2 using PIVOT with varchar columns not working 【发布时间】:2013-07-19 18:54:21 【问题描述】:

我使用的是 SQL Server 2008 R2,我有这个简单的表

我试图做的是从这个表中进行选择并得到以下结果

x |      1     |       2     |      3
--+------------+-------------+------------
1 |   first 1  |    first 2  |    first 3
2 |   Second 1 |    second 2 |    second 3 

我认为可以通过PIVOT 完成

我不太了解 PIVOT 以及使用 PIVOT 和 Count() 找到的所有搜索结果。 SUM(), AVG() 这在我的表中不起作用,因为我试图在 varchar 列上使用 PIVOT

问题我是否使用了正确的功能?或者我还需要知道什么来解决这个问题?任何帮助将不胜感激

我试过这个没有运气

PIVOT(count(x) FOR value IN ([1],[2],[3]) )as total 
PIVOT(count(y) FOR value IN ([1],[2],[3]) )as total  // This one is the nearest 
of what i wand  but instead of the column value values i get 0  

这里是查询是否有人测试它

CREATE TABLE #test (x int , y int , value Varchar(50))
INSERT INTO #test VALUES(1,51,'first 1')
INSERT INTO #test VALUES(1,52,'first 2')
INSERT INTO #test VALUES(1,53,'first 3')
INSERT INTO #test VALUES(2,51,'Second 1')
INSERT INTO #test VALUES(2,52,'Second 2')
INSERT INTO #test VALUES(2,53,'Second 3')
SELECT * FROM #test
  PIVOT(count(y) FOR value IN ([1],[2],[3]) )as total 
 DROP TABLE #test 

【问题讨论】:

你要退货吗 - SQL DEMO 我闻到一个新问题,谁的答案涉及动态sql。 @MinaGabriel 查看我的编辑,它包括动态 sql 以及值是否已知。 我有几个这样的查询,没有人能弄清楚我为什么要让它们成为动态 sql ......直到他们自己解决了问题。其中之一,“我会重写这个,它会好 100 倍”,当你完成时,它是一样的。 【参考方案1】:

当您使用 PIVOT 函数时,IN 子句中的值需要与您选择的值相匹配。您当前的数据不包括 1、2 或 3。您可以使用 row_number() 为每个 x 分配一个值:

select x, [1], [2], [3]
from
(
  select x, value,
    row_number() over(partition by x order by y) rn
  from test
) d
pivot
(
  max(value)
  for rn in ([1], [2], [3])
) piv;

见SQL Fiddle with Demo。如果您对每个 x 有未知数量的值,那么您将需要使用动态 SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(row_number() over(partition by x order by y)) 
                    from test
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT x,' + @cols + ' 
            from 
            (
              select x, value,
                row_number() over(partition by x order by y) rn
              from test
            ) x
            pivot 
            (
                max(value)
                for rn in (' + @cols + ')
            ) p '

execute(@query);

见SQL Fiddle with Demo

【讨论】:

【参考方案2】:

关键是对文本字段使用 Max 函数。

查询:

SELECT X, [51] [1], [52] [2], [53] [3]
FROM (select * from test) t
  PIVOT(max(Value) FOR Y IN ([51], [52], [53]) )as total 

Working demo

【讨论】:

【参考方案3】:
SELECT *
FROM #test
 PIVOT(MAX(value) FOR y IN ([51],[52],[53]) )as total 

【讨论】:

【参考方案4】:

我给你一个窍门,但它没有意义。

SELECT * FROM
(SELECT x, y-50 as y, value FROM test) src
  PIVOT(max(value) FOR y IN ([1],[2],[3]) )as total

【讨论】:

【参考方案5】:

你说value IN ([1],[2],[3])。这意味着“如果值恰好等于 1、2 或 3,则匹配”。但在你的桌子上从来没有。哪里不对劲。

【讨论】:

评论而不是答案? 回答,因为它告诉他如何解决他的问题。我是不是搞错了?

以上是关于SQL Server 2008 R2 使用 PIVOT 和 varchar 列不起作用的主要内容,如果未能解决你的问题,请参考以下文章

windows server2012 r2能安装sqlserver2008 R2吗

sql server 2008 r2 sp1 怎么看版本

win2012 server r2 怎么打开安装的sql2008

sql 2008 r2 在sql 2008上兼容么

sql 2008 r2 这两个版本的区别

跪求SQL Server 2008 R2 Standard (64