sql多条件排序

时间:2022-03-25 19:20:04
id name groupId date levelid
1  a     1      2008   1
2  b     1      2009   1
3  c     2      2007   2
4  d     3      2006   3
5  e     3      2006   3

排序条件:
1\无论怎么排列 都按照groupid进行排序,就是说以groupId为单位
2\以groupId为单位排列 再按照其它条件 排列如 先以groupid排,再按照   date 或者 levelid

我的疑惑:
排列obder by 本来就是以唯一条件进行排,如果上述要求是不是违背了排列规则?

问:能实现吗

17 个解决方案

#1


select * from tb order by groupid , date , levelid 

#2


select * 
from tb
order by groupid,[date],levelid

?

#3


order by 后面可以跟多个列的排序.

#4


先以groupid排,在groupid 相同的情况下,再按照  date  排列或者 levelid 


所以谈不上违背了排列规则 

#5


- - 

#6


ORDER BY 子句
指定结果集的排序。除非同时指定了 TOP,否则 ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。

语法
[ ORDER BY { order_by_expression [ ASC | DESC ] }    [ ,...n ] ]

参数
order_by_expression

指定要排序的列。可以将排序列指定为列名或列的别名(可由表名或视图名限定)和表达式,或者指定为代表选择列表内的名称、别名或表达式的位置的负整数。 

可指定多个排序列。ORDER BY 子句中的排序列序列定义排序结果集的结构。
ORDER BY 子句可包括未出现在此选择列表中的项目。然而,如果指定 SELECT DISTINCT,或者如果 SELECT 语句包含 UNION 运算符,则排序列必定出现在选择列表中。

此外,当 SELECT 语句包含 UNION 运算符时,列名或列的别名必须是在第一选择列表内指定的列名或列的别名。



说明  在 ORDER BY 子句中不能使用 ntext、text 和 image 列。


ASC

指定按递增顺序,从最低值到最高值对指定列中的值进行排序。

DESC

指定按递减顺序,从最高值到最低值对指定列中的值进行排序。

空值被视为最低的可能值。

对 ORDER BY 子句中的项目数没有限制。然而,对于排序操作所需的中间级工作表的大小有 8,060 字节的限制。这限制了在 ORDER BY 子句中指定的列的合计大小。

#7


要什麼結果?

#8


select * from tb order by groupid ,date,levelid

#9


select * from tb order by groupid , date , levelid ,id

#10


--楼主要的结果是这样吗?
----------------------------------------------------------------
-- Author  :fredrickhu(我是小F,向高手学习)
-- Date    :2009-11-27 11:04:10
-- Version:
--      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
-- Nov 24 2008 13:01:59 
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([id] int,[name] varchar(1),[groupId] int,[date] int,[levelid] int)
insert [tb]
select 1,'a',1,2008,1 union all
select 2,'b',1,2009,1 union all
select 3,'c',2,2007,2 union all
select 4,'d',3,2006,3 union all
select 5,'e',3,2006,3
--------------开始查询--------------------------
select * from tb order by groupid ,date,levelid
----------------结果----------------------------
/* id          name groupId     date        levelid
----------- ---- ----------- ----------- -----------
1           a    1           2008        1
2           b    1           2009        1
3           c    2           2007        2
4           d    3           2006        3
5           e    3           2006        3

(5 行受影响)
*/

#11


查查联机丛书,看看order by 用法...

#12


数据多样性,理论上是可以存在完全相同的两条记录的(虽然实际应该避免出现这种不容易处理的情况)

#13


order by groupId,date,levelid、
--先按groupID排序,再按date 再按 levelid 排序

#14


select * from tb order by groupid ,date,levelid

如果 我要想按照 date升 且 levelid降 呢
怎么排

#15


引用 14 楼 shuai45 的回复:
select * from tb order by groupid ,date,levelid

如果 我要想按照 date升 且 levelid降 呢
怎么排


select * from tb order by groupid ,date,levelid desc 

#16


看来我要补充基本知识了,哎
原来自己的sql还很弱

结帖!

#17


又学会了一招

#1


select * from tb order by groupid , date , levelid 

#2


select * 
from tb
order by groupid,[date],levelid

?

#3


order by 后面可以跟多个列的排序.

#4


先以groupid排,在groupid 相同的情况下,再按照  date  排列或者 levelid 


所以谈不上违背了排列规则 

#5


- - 

#6


ORDER BY 子句
指定结果集的排序。除非同时指定了 TOP,否则 ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。

语法
[ ORDER BY { order_by_expression [ ASC | DESC ] }    [ ,...n ] ]

参数
order_by_expression

指定要排序的列。可以将排序列指定为列名或列的别名(可由表名或视图名限定)和表达式,或者指定为代表选择列表内的名称、别名或表达式的位置的负整数。 

可指定多个排序列。ORDER BY 子句中的排序列序列定义排序结果集的结构。
ORDER BY 子句可包括未出现在此选择列表中的项目。然而,如果指定 SELECT DISTINCT,或者如果 SELECT 语句包含 UNION 运算符,则排序列必定出现在选择列表中。

此外,当 SELECT 语句包含 UNION 运算符时,列名或列的别名必须是在第一选择列表内指定的列名或列的别名。



说明  在 ORDER BY 子句中不能使用 ntext、text 和 image 列。


ASC

指定按递增顺序,从最低值到最高值对指定列中的值进行排序。

DESC

指定按递减顺序,从最高值到最低值对指定列中的值进行排序。

空值被视为最低的可能值。

对 ORDER BY 子句中的项目数没有限制。然而,对于排序操作所需的中间级工作表的大小有 8,060 字节的限制。这限制了在 ORDER BY 子句中指定的列的合计大小。

#7


要什麼結果?

#8


select * from tb order by groupid ,date,levelid

#9


select * from tb order by groupid , date , levelid ,id

#10


--楼主要的结果是这样吗?
----------------------------------------------------------------
-- Author  :fredrickhu(我是小F,向高手学习)
-- Date    :2009-11-27 11:04:10
-- Version:
--      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
-- Nov 24 2008 13:01:59 
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([id] int,[name] varchar(1),[groupId] int,[date] int,[levelid] int)
insert [tb]
select 1,'a',1,2008,1 union all
select 2,'b',1,2009,1 union all
select 3,'c',2,2007,2 union all
select 4,'d',3,2006,3 union all
select 5,'e',3,2006,3
--------------开始查询--------------------------
select * from tb order by groupid ,date,levelid
----------------结果----------------------------
/* id          name groupId     date        levelid
----------- ---- ----------- ----------- -----------
1           a    1           2008        1
2           b    1           2009        1
3           c    2           2007        2
4           d    3           2006        3
5           e    3           2006        3

(5 行受影响)
*/

#11


查查联机丛书,看看order by 用法...

#12


数据多样性,理论上是可以存在完全相同的两条记录的(虽然实际应该避免出现这种不容易处理的情况)

#13


order by groupId,date,levelid、
--先按groupID排序,再按date 再按 levelid 排序

#14


select * from tb order by groupid ,date,levelid

如果 我要想按照 date升 且 levelid降 呢
怎么排

#15


引用 14 楼 shuai45 的回复:
select * from tb order by groupid ,date,levelid

如果 我要想按照 date升 且 levelid降 呢
怎么排


select * from tb order by groupid ,date,levelid desc 

#16


看来我要补充基本知识了,哎
原来自己的sql还很弱

结帖!

#17


又学会了一招