在获取行sql时对表中的列进行排序

时间:2018-03-04 16:51:24

标签: sql sql-server

说我有一张看起来像这样的表:

+----------------------------------+-
|    Id   |  Sub1   |  Sub2 | Sub3 |
+----------------------------------+-
|  X      |   100   |  55   |  65  |
|  Y      |   45    |  55   |  65  |
|  Z      |   95    |  55   |  65  |
+----------------------------------+-

如何对为特定行提取的列进行排序? Select * from MARKS_TABLE WHERE Id='X'排序Sub1,Sub2,Sub3列应返回55,65,100。

我想过使用ORDERBY但是使用ORDERBY你需要知道哪些列要排序,在这种情况下哪些列不起作用。

要使用的SQL表: http://sqlfiddle.com/#!9/e7d954/1

2 个答案:

答案 0 :(得分:1)

在SQL Server中,我会使用条件聚合和apply

select t.id,
       max(case when seqnum = 1 then sub end) as sub1,
       max(case when seqnum = 2 then sub end) as sub2,
       max(case when seqnum = 3 then sub end) as sub3
from t apply
     (select v.sub, row_number() over (order by v.sub) as seqnum
      from (values (t.sub1), (t.sub2), (t.sub3)
           ) as v(sub)
     ) v;

顺便说一句,您可以在Oracle 12c中执行类似的操作,但在早期版本中语法会略有不同。

applysub?的每个值将每行展开为多行。 row_number()根据排序提供序号。然后外部查询使用条件聚合来按顺序获取所需的三个值。

答案 1 :(得分:1)

您可以使用UNION ALL:

  select sub1
  from marks
  where ID = 1
  union all
  select sub2
  from Marks
  where ID = 1
  union all
  select sub3
  from marks
  where ID = 1
  order by 1