按语句排序 - 按多列排序

时间:2016-07-29 08:13:44

标签: sql oracle sql-order-by

我有这样的表:

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   

2 个答案:

答案 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