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

问题描述 投票:1回答:2

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

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

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

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

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

sql sql-server
2个回答
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

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中执行类似的操作,但在早期版本中语法会略有不同。

对于apply的每个值,sub?将每一行扩展为多行。 row_number()根据订单提供序号。然后外部查询使用条件聚合来按顺序获取所需的三个值。

© www.soinside.com 2019 - 2024. All rights reserved.