说我有一张看起来像这样的表:
+----------------------------------+-
| 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
答案 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中执行类似的操作,但在早期版本中语法会略有不同。
apply
为sub?
的每个值将每行展开为多行。 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