我有这样的表:
A B C
-----------------------
111 3
777
333 1
555 2
333
777 4
888 5
所以,我按照“按B排序”的顺序排序,我的结果如下:
A B C
----------------------
333 1
555 2
111 3
777 4
888 5
777
333
但是,我该怎么做才能进行这种排序:
A B C
-----------------------
333 1
333
555 2
111 3
777 4
777
888 5
如果C列不为null,我应该在A = C
之后的行之后放置这一行谢谢!
所以,如果是这样的话:
with a(a,b,c) as (select 111,4, null from dual union all
select null,null,777 from dual union all
select 333,1,null from dual union all
select 555,2, null from dual union all
select null,null, 333 from dual union all
select 777, 4, null from dual union all
select 444,null, 333 from dual union all
select 888, 5, null from dual union all
select null,null,777 from dual )
select a.*
from a
order by last_value(b ignore nulls)
over (partition by CASE when b is null then c else a end order by b), b nulls last
我有输出(C 777在A 111之后,因为B值相同= 4):
A B C
--------------------
333 1
444 333
333
555 2
777 4
111 4
777
777
888 5
但我希望得到这个:
A B C
--------------------
333 1
444 333
333
555 2
777 4
777
777
111 4
888 5
答案 0 :(得分:3)
可能对您有所帮助:
with a(a,b,c) as (select 111,3, null from dual union all
select null,null,777 from dual union all
select 333,1,null from dual union all
select 555,2, null from dual union all
select null,null, 333 from dual union all
select 777, 4, null from dual union all
select 888, 5, null from dual )
select a.*
from a
order by last_value(b ignore nulls) over (partition by nvl(a,c) order by b), b nulls last
输出
333 1
333
555 2
111 3
777 4
777
888 5
选择7行
或者如你所说,你可以同时拥有非A和C列,你可以这样做:
with a(a,b,c) as (select 111,3, null from dual union all
select null,null,777 from dual union all
select 333,1,null from dual union all
select 555,2, null from dual union all
select null,null, 333 from dual union all
select 777, 4, null from dual union all
select 444,null, 333 from dual union all
select 888, 5, null from dual )
select a.*
from a
order by last_value(b ignore nulls)
over (partition by CASE when b is null then c else a end order by b), b nulls last
输出
A B C
333 1
333
444 333
555 2
111 3
777 4
777
888 5
8 rows selected
答案 1 :(得分:1)
这样做:
select case when C in not null then C else A end as A,B,C from table
和以下一样:
Declare @c nchar(50)
Declare @a nchar(50)
set @c = 'record'
set @a = 'sample'
select case when @c is not null then @c else @a end as A,@c as C