按多列排序

时间:2013-04-26 06:48:33

标签: .net sql-server tsql

我有一个数据库,需要一个或多或少简单的select语句,需要按4列排序。我不需要“按字段1,字段2,字段3,字段4排序”,但我需要从这些字段的最低值到最高值排序,无论值在哪里。

例如,如果我有与此类似的数据

Field1    Field2     Field3      Field4
---------------------------------------
   3         4           6           7
   9         5           4           1
   5         4           8           2
   6         4           4           5

数据应按如下方式排序:

Field1    Field2     Field3      Field4
---------------------------------------
   9         5           4           1
   5         4           8           2
   3         4           6           7
   6         4           4           5

因此,1包含在字段4中,这是最低值,因此该行首先出现,同样适用于数字2,这也是第4列,之后,我们在第1列中有一个数字3行进入下一行,最后一行是第2列和第3列中的第4行。我不确定我是否解释了这个问题,所以如果需要进一步解释,请告诉我。

有没有办法直接使用mssql执行此操作,还是需要在实际代码中对datatable进行排序?

2 个答案:

答案 0 :(得分:3)

with data as (
    select *
    from (
    values (   3         ,4           ,6           ,7),
       (9         ,5           ,4           ,1),
       (5         ,4           ,8           ,2),
       (6         ,4           ,4           ,5)
    ) t (Field1    ,Field2     ,Field3      ,Field4)
)
select * from data
order by (case when Field1 < Field2 and Field1 < Field3 and Field1 < Field4 then Field1
                when Field2 < Field1 and Field2 < Field3 and Field1 < Field4 then Field2
                when Field3 < Field1 and Field3 < Field2 and Field1 < Field4 then Field3
                else Field4 end)

此外,还有一种更具扩展性的方式:

with data as (
    select *
    from (
    values (   3         ,4           ,6           ,7),
       (9         ,5           ,4           ,1),
       (5         ,4           ,8           ,2),
       (6         ,4           ,4           ,5)
    ) t (Field1    ,Field2     ,Field3      ,Field4)
)
select d.*
from data d
order by (select min(Field) 
          from (values (Field1), (Field2), (Field3), (Field4)) t(Field))

答案 1 :(得分:2)

您可以使用以下内容:

SELECT *,
  CASE WHEN Field1 < Field2 AND Field1 < Field3 AND Field1 < Field4 THEN Field1
       WHEN Field2 < Field1 AND Field2 < Field3 AND Field2 < Field4 THEN Field2
       WHEN Field3 < Field1 AND Field3 < Field2 AND Field3 < Field4 THEN Field3
       ELSE Field4 END
       as SORTFIELD
from table
ORDER BY SORTFIELD