我正在尝试在SQL Server存储过程中使用PIVOT来获取以下数据:
ID Rank
203081 1.1
200761 3.9
202687 5.3
203135 5.0
203090 3.3
并返回ID水平排序。排名从1到6,每个排名介于其间的十分之一。例1.0,1.1,1.2,1.3,...... 1.9,2.0
ID需要按排名顺序排序。
结果应返回如下内容:
(如果聚合所需的其他列也可以。)
[1] ,[2] ,[3] ,[4] ,[5]
202687,203135,200761,203090,203081
使用上述数据,ID将按等级排序为5.3-> 5.0-> 3.9-> 3.3-> 1.1
最后,我需要获取结果并将它们插入到另一个表中,ID水平排序。
我无法使PIVOT正常工作。我确信这是我看不到的明显事物。
如果有更好/更快的方式来实现所需,我想知道该解决方案是什么。
答案 0 :(得分:3)
听起来你只需要使用row_number()
来获得正确的排序,然后在该行号上PIVOT数据。
如果您的数值有限,则可以使用:
select [1], [2], [3], [4], [5]
from
(
select id,
row_number() over(order by [rank] desc) seq
from yourtable
) d
pivot
(
max(id)
for seq in ([1], [2], [3], [4], [5])
) piv;
或者,如果您要使用未知数字,则将使用动态SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(row_number() over(order by [rank] desc))
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + '
from
(
select id,
row_number() over(order by [rank] desc) seq
from yourtable
) x
pivot
(
max(id)
for seq in (' + @cols + ')
) p '
execute sp_executesql @query;
见SQL Fiddle with Demo。结果如下:
| 1 | 2 | 3 | 4 | 5 |
|--------|--------|--------|--------|--------|
| 202687 | 203135 | 200761 | 203090 | 203081 |