SQL Server从不同的列对多个值进行排序,然后根据值的升序重新分配它们

时间:2018-10-09 17:12:40

标签: sql sql-server

我有一条select语句,它带5个不同列的值。

SELECT TOP 1 digit1, digit2, digit3, digit4, digit5 FROM myTable

结果是“ 25,36,1,63,12”。

我的问题是,如何按升序对这些数字进行排序,然后将它们分别分配给它们的升序列? 即:digit1 = 1,digit2 = 12,digit3 = 25,digit4 = 36,digit5 = 63。

预先感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

您可以先进行UNPIVOT,然后进行PIVOT

示例

Select *
 From (
        Select Item = concat('digit',Row_NUmber() over (Order by Value))
              ,Value
         From  (Select top 1 * from YourTable) A
         UnPivot ( Value for Digits in (digit1,digit2,digit3,digit4,digit5)  ) U
       ) A 
 Pivot (max(Value) for Item in (digit1,digit2,digit3,digit4,digit5) ) P

返回

digit1  digit2  digit3  digit4  digit5
1       12      25      36      63

答案 1 :(得分:0)

如果要按多个值对结果进行排序,则可以使用以下语法。

SELECT TOP 1 digit1, digit2, digit3, digit4, digit5 
FROM myTable
ORDER BY digit1, digit2, digit3, digit4, digit5

如果需要操纵值,则可能需要创建UDF / CTE或内联表达式来确定列的“值”以对它们进行排序。没有完整的工作示例(SQLFiddle会有所帮助),很难确定。

答案 2 :(得分:0)

使用CTE应该可以简化为类似以下内容。我假设您需要用于多行,但是将其简化为单行比将解决方案扩展到多行要容易

WITH MyData as (
SELECT ID, digit1 as Digit FROM myTable
UNION ALL
SELECT ID, digit2 FROM myTable
UNION ALL
SELECT ID, digit3 FROM myTable
UNION ALL
SELECT ID, digit4 FROM myTable
UNION ALL
SELECT ID, digit5 FROM myTable
)
SELECT ID, Digit
FROM MyData
ORDER BY ID, Digit

您的数据现在已经整理好了。一个简单的PIVOT将为您提供所需的输出。

答案 3 :(得分:0)

我会使用apply

select v.*
from (select top 1 digit1, digit2, digit3, digit4, digit5 FROM myTable
     ) t cross apply
     (select max(case when seqnum = 1 then digit end) as digit1,
             max(case when seqnum = 2 then digit end) as digit2,
             max(case when seqnum = 3 then digit end) as digit3,
             max(case when seqnum = 4 then digit end) as digit4,
             max(case when seqnum = 5 then digit end) as digit5
      from (select v.digit, row_number() over (order by v.digit) as seqnum
            from (values (digit1), (digit2), (digit3), (digit4), (digit5)
                 ) v(digit)
           ) v
     ) v;