说我有一个看起来像这样的表:
+----------------------------------+-
| 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
你可以使用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
在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()
根据订单提供序号。然后外部查询使用条件聚合来按顺序获取所需的三个值。