【问题标题】:SQL Server Sort fixed number of rows/columns horizontallySQL Server 对固定数量的行/列进行水平排序
【发布时间】:2013-11-19 22:00:54
【问题描述】:

我正在尝试在 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 正常工作。我敢肯定这是我没有看到的明显的东西。

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

【问题讨论】:

  • “如果有更好/更快的方法” - 这是一个又好又快的方法。

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


【解决方案1】:

听起来您只需要使用 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 |

【讨论】:

  • 完美!我试图让它变得比需要的更困难。
猜你喜欢
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
相关资源
最近更新 更多