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吗