SQL Server - 按类别排序

时间:2017-03-31 18:31:25

标签: sql-server tsql sql-server-2012

我有一个排序问题。我正在使用SQL Server 2012.我有以下数据集。空行用于显示目的。

Country        CountryUser        State        StateUser
---------------------------------------------------------
Canada         User1              null         null
Canada         User2              null         null
USA            User2              null         null
USA            User3              null         null

Canada         User1              BC           User4
Canada         User1              BC           User5
Canada         User1              ON           User4
Canada         User1              ON           User8

Canada         User2              BC           User4
Canada         User2              BC           User5
Canada         User2              ON           User4
Canada         User2              ON           User8
total rows: 12

我想对行进行排序,使得包含状态的所有行显示在其国家/地区下方(以null作为状态的行)。例如,

Country        CountryUser        State        StateUser
---------------------------------------------------------
Canada         User1              null         null
Canada         User1              BC           User4
Canada         User1              BC           User5
Canada         User1              ON           User4
Canada         User1              ON           User8

Canada         User2              null         null
Canada         User2              BC           User4
Canada         User2              BC           User5
Canada         User2              ON           User4
Canada         User2              ON           User8

USA            User2              null         null
USA            User3              null         null
total rows: 12

第一个排序类别是国家/地区。首先显示具有空状态的行,然后显示所有状态为非空。这些行具有第二种状态

3 个答案:

答案 0 :(得分:1)

您可以按顺序使用案例:

select * 
from #yourCountry 
order by CountryUser, case when state is null then '00000000' else 'zzzzz' end
                    , case when stateUser is null then '00000000' else 'zzzzz' end

你的桌子:

create table #yourCountry ( Country varchar(15), CountryUser varchar(10), State varchar(5), StateUser varchar(10))

insert into #yourCountry (
Country    ,    CountryUser ,       State    ,    StateUser  ) values
---------------------------------------------------------
 ('Canada','User1',null , null )
,('Canada','User2',null , null )
,('USA   ','User2',null , null )
,('USA   ','User3',null , null )
,('Canada','User1','BC','User4')
,('Canada','User1','BC','User5')
,('Canada','User1','ON','User4')
,('Canada','User1','ON','User8')
,('Canada','User2','BC','User4')
,('Canada','User2','BC','User5')
,('Canada','User2','ON','User4')
,('Canada','User2','ON','User8')

答案 1 :(得分:0)

尝试添加一个包含四列的order by子句:

select 'Canada'  as Country   ,    'User1' as CountryUser,null as State,null as StateUser
    union all select 'Canada', 'User2', null, null
    union all select 'USA'   , 'User2', null, null
    union all select 'USA'   , 'User3', null, null
    union all select 'Canada', 'User1', 'BC', 'User4'
    union all select 'Canada', 'User1', 'BC', 'User5'
    union all select 'Canada', 'User1', 'ON', 'User4'
    union all select 'Canada', 'User1', 'ON', 'User8'
    union all select 'Canada', 'User2', 'BC', 'User4'
    union all select 'Canada', 'User2', 'BC', 'User5'
    union all select 'Canada', 'User2', 'ON', 'User4'
    union all select 'Canada', 'User2', 'ON', 'User8'
order by Country, CountryUser, State, StateUser

结果如下:

enter image description here

修改

这是有效的,因为Sql Server 2012将null值视为最低值。请参阅MSDN以供参考,以下是摘录:

  

ASC | DESC
  指定指定列中的值应该是   按升序或降序排序。 ASC从最低级别排序   价值到最高价值。 DESC从最高值到最低值排序。   ASC是默认排序顺序。 将空值视为最低值   可能的值。

答案 2 :(得分:-1)

通过table_atr desc

从表格顺序中选择*