Min*_*iel 2 sql sql-server pivot sql-server-2008-r2
我正在使用SQL Server 2008 R2,我有这个简单的表

我试图做的是从这个表中做出选择并获得以下结果
x | 1 | 2 | 3
--+------------+-------------+------------
1 | first 1 | first 2 | first 3
2 | Second 1 | second 2 | second 3
Run Code Online (Sandbox Code Playgroud)
我认为可以做到 PIVOT
我不太了解PIVOT和使用PIVOT找到的所有搜索结果Count().SUM(),AVG()因为我正在尝试PIVOT使用varchar列,因此无法在我的表中使用
问题是我使用了正确的功能吗?或者还有什么我需要知道解决这个问题?任何帮助将不胜感激
我试了这个没有运气
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
Run Code Online (Sandbox Code Playgroud)
这是查询是否有任何一个来测试它
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
Run Code Online (Sandbox Code Playgroud)
使用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;
Run Code Online (Sandbox Code Playgroud)
请参阅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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16083 次 |
| 最近记录: |