SQL Server水平排序固定数量的行/列

时间:2013-11-19 22:00:55

标签: sql sql-server sorting stored-procedures pivot

我正在尝试在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正常工作。我确信这是我看不到的明显事物。

如果有更好/更快的方式来实现所需,我想知道该解决方案是什么。

1 个答案:

答案 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 Fiddle with Demo

或者,如果您要使用未知数字,则将使用动态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 |