SQL查询结果按照指定内容排序

Posted 晓之以理的喵~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL查询结果按照指定内容排序相关的知识,希望对你有一定的参考价值。

一般来说,我们在开发SQL脚本的时候,遇到需要排序的内容,用order by需要排序的字段就可以满足我们排序的需求,asc为升序、desc为降序,不指定关键字默认为升序。但是有时候,我们需要的排序不仅仅是升序和降序,asc与desc并不能满足我们的排序需求,所以我们需要用到按照指定的内容进行排序的操作,下面我们就从mysql与Oracle两个数据库来看一下具体的操作:

一、MySQL

1,函数FIELD

格式:order by FIELD(需要排序的字段,字段内容1,字段内容2,字段内容3)
示例:order by FIELD(office_name,'云南办','江苏办','山西办')
释义:数据结果按照office_name排序,指定顺序为'云南办','江苏办','山西办'

特殊情况说明:

(1)指定的排序内容为字段的所有内容

意思是office_name里面只包含’云南办’,‘江苏办’,‘山西办’,可以直接用下面语句进行排序

order by FIELD(office_name,'云南办','江苏办','山西办')
释义:查询结果排序内容为四川省、甘肃省、陕西省
示例:
SELECT DISTINCT office_code,office_name 
FROM EC_ZB.ecorder_completion_rate_day
WHERE 1=1
AND office_name IN ('云南办','江苏办','山西办')
ORDER BY FIELD(office_name,'云南办','江苏办','山西办') 

结果展示:

(2)指定的排序内容为字段的部分内容

意思是office_name里面不仅包含’云南办’,‘江苏办’,‘山西办’,还有别的内容,但是你只想把这三个省的内容放在最前面,那么你需要用下面的语句进行排序

order by FIELD(office_name,'山西办','江苏办','云南办') desc
释义:这样的排序内容为云南办、江苏办、山西办、其他省份数据
SELECT DISTINCT office_code,office_name 
FROM EC_ZB.ecorder_completion_rate_day
WHERE 1=1
-- AND office_name IN ('云南办','江苏办','山西办')
ORDER BY FIELD(office_name,'山西办','江苏办','云南办')  desc

结果展示:

如果使用order by FIELD(office_name,‘云南办’,‘江苏办’,‘山西办’) ,
排序内容为 其他省份,‘云南办’,‘江苏办’,‘山西办’

SELECT DISTINCT office_code,office_name 
FROM EC_ZB.ecorder_completion_rate_day
WHERE 1=1
-- AND office_name IN ('云南办','江苏办','山西办')
ORDER BY FIELD(office_name,'云南办','江苏办','山西办') 

结果展示:

2,函数locate

locate的用法和field很相似,只是locate是判断字符串的内容是否包含在指定的字符串里。下面是详细讲解

格式:locate(subStr,string) 
释义:判断字符串(string)中是否包含另一个字符串(subStr),函数返回的是subStr在string中出现的位置
示例:ORDER BY LOCATE(office_name,'云南办,江苏办,山西办') 

SELECT DISTINCT office_code,office_name 
FROM EC_ZB.ecorder_completion_rate_day
WHERE 1=1
AND office_name IN ('云南办','江苏办','山西办')
ORDER BY LOCATE(office_name,'云南办,江苏办,山西办') 

结果展示

二、Oracle

在Oracle中,使用decode函数,就可以实现按照指定内容排序的功能,下面是详细的讲解。

格式:order by decode(条件,1,返回值1,2,返回值2,...值n,返回值n,缺省值)
示例:ORDER BY DECODE(agency_name,'云南独资办事处','1','江苏独资办事处','2','四川直营办事处','3')
释义:查询结果按照agency_name字段的云南独资办事处、江苏独资办事处、四川直营办事处排序

1,指定的内容为字段的全部内容

SQL例子:

SELECT DISTINCT  AGENCY_CODE ,agency_name 
FROM ecorder.ec_order
WHERE 1=1
AND AGENCY_CODE IS NOT NULL
AND agency_name IN ('云南独资办事处','江苏独资办事处','四川直营办事处')
ORDER BY DECODE(agency_name,'云南独资办事处','1','江苏独资办事处','2','四川直营办事处','3')

查询结果:

2,指定内容为字段的部分内容

Oracle的decode函数,和MySQL的field()函数还是有差别的,即便是你在排序的时候,指定的内容为字段的部分内容,也不会影响排序结果,首先按照指定内容排序,其他的放在指定内容的后面。
示例SQL:

SELECT DISTINCT  AGENCY_CODE ,agency_name 
FROM order.order
WHERE 1=1
AND AGENCY_CODE IS NOT NULL
ORDER BY DECODE(agency_name,'云南独资办事处','1','江苏独资办事处','2','四川直营办事处','3')

查询结果:

到这里,指定字段内容的排序就结束了,大家可以按照自己的需求以及目标数据库进行对应选择使用,希望可以给你带来思路和开发便利。

我是晓之以理的喵~,欢迎交流。

SQL查询结果加入排序值的问题

我查询出来四个字段,比如商品编码,销量,销额,毛利这四个,我希望在显示的时候显示这样几个字段,商品编码,销量,销量排名,销额,销额排名,毛利,毛利排名。
数据库是DB2的.我指导order by,那只是排序。我想要的列是某个商品的销量在所有商品中销量的排名情况,销额的排名情况,毛利的排名情况

select *
from 表
order by (select case sunxun when \'A\' then 3 when \'B\' then 1 when \'C\' then 2 when \'D\' then 4 end)

试试吧,SQL SERVER适用。
两表联合查询,再排下序就行了INNER JOIN 运算
组合两个表中的记录,只要在公共字段之中有相符的值。

语法
FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field2

INNER JOIN 运算可分为以下几个部分:

部分 说明
table1, table2 记录被组合的表的名称。
field1, field2 被联接的字段的名称。若它们不是由数字构成的,则这些字段必须为相同的数据类型并包含同类数据,但它们无须具有相同的名称。
compopr 任何的关系比较运算子:"=," "<," ">," "<=," ">=," 或 "<>."

说明
可以在 FROM 子句中使用INNER JOIN运算。.这是最普通的联接类型。只要在这两个表的公共字段之中有相符值,内部联接将组合两个表中的记录。

可以使用 INNER JOIN 与部门表及员工表选择每一个部门中的全部员工。反之,可以使用 LEFT JOIN或 RIGHT JOIN运算创建 outer join,从而选择所有部门(即使有些并没有员工)或所有员工(即使有些尚未分配到部门)。

若试图联接包含 Memo或 OLE Object数据的字段,会导致错误。

可以联接任何两个相同类型的数值字段。例如,可以联接 AutoNumber和 Long字段,因为它们类型相似。但不能联接 Single 和 Double 类型的字段。

下列示例显示如何在类标识符字段联接类表及产品表:

SELECT CategoryName, ProductName

FROM Categories INNER JOIN Products

ON Categories.CategoryID = Products.CategoryID;

在上面的示例中,类标识符是已被联接的字段,但是它并不包含在查询输出中,因它并非被包含在 SELECT 语句之中。在这个示例中,若要包含联接字段,将字段名包含在 SELECT 语句中, Categories.CategoryID.

也可以使用下列语法,在一个 JOIN 语句中链接多个 ON 子句:

SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2) OR
ON table1.field3 compopr table2.field3)];

也可以使用下列语法,嵌套 JOIN 语句:

SELECT fields
FROM table1 INNER JOIN
(table2 INNER JOIN [( ]table3
[INNER JOIN [( ]tablex [INNER JOIN ...)]
ON table3.field3 compopr tablex.fieldx)]
ON table2.field2 compopr table3.field3)
ON table1.field1 compopr table2.field2;

在一个 INNER JOIN 之中,可以嵌套 LEFT JOIN 或 RIGHT JOIN,但是在 LEFT JOIN 或 RIGHT JOIN 中不能嵌套 INNER JOIN。
--------------------------------------------
ORDER BY 子句
按照递增或递减顺序在指定字段中对查询的结果记录进行排序。

语法
SELECT 字段表
FROM 表
WHERE选择准则
[ORDER BY字段1 [ASC | DESC ][, 字段2 [ASC | DESC ]][, ...]]]

包含 ORDER BY 子句的 SELECT 语句具有以下几个部分:

部分 说明
fieldlist 要和任何字段名别名, SQL 合计函数s, 选择断定 (ALL, DISTINCT, DISTINCTROW或 TOP)或其他 SELECT 语句 选择一起检索的字段名称。
table 从其中获取记录的表的名称。欲知更多信息请看 FROM 子句.
selectcriteria 选择准则。如果此 语句 包含一个 WHERE 子句, Microsoft Jet数据库引擎 会在记录上应用WHERE条件,然后把值排序。
field1, field2 要排序记录的字段名。

说明
ORDER BY 是可选的。不过,如果要将数据以排序时的顺序显示出来,就必须使用 ORDER BY。

缺省排序顺序是升序 (A至 Z, 0至 9).以下两个示例都用雇员的姓对雇员姓名排序:

SELECT LastName, FirstName

FROM Employees

ORDER BY LastName;

SELECT LastName, FirstName

FROM Employees

ORDER BY LastName ASC;

为按递减顺序排序(Z 至 A,9 至0),必须将 DESC 保留字添加到要递减排序的每一字段的尾部。下例选择雇员薪金并对雇员用递减顺序排序。

SELECT LastName, Salary

FROM Employees

ORDER BY Salary DESC, LastName;

如果你在ORDER BY 子句中标明了包含 Memo或 OLE Object数据的一个字段,一个错误就产生了。Microsoft Jet 数据库引擎不对这些类型的字段排序。

ORDER BY通常是 SQL 语句中最后一项。

ORDER BY 子句可包含添加的字段。首先用 ORDER BY之后列举的第一个字段对记录排序。然后对此字段中等值的记录用第二字段列举的值进行排序,依此类推。
参考技术A create table test(
商品编码 int identity(1,1),
销量 int,
销额 int,
毛利 int
)
insert test select 2,26,77
union select 55,55,65
union select 5,35,90
union select 55,2,5
union select 54,24,2

select 商品编码,
销量,销量名次=(select count(*)+1 from test a where a.销量>b.销量),
销额,销额名次=(select count(*)+1 from test a where a.销额>b.销额),
毛利,毛利名次=(select count(*)+1 from test a where a.毛利>b.毛利) from test b
参考技术B 用 order by命令 参考技术C 用存储过程

以上是关于SQL查询结果按照指定内容排序的主要内容,如果未能解决你的问题,请参考以下文章

oracle高级查询

Oracle PL/SQL查询结果如何自动换行

Oracle PL/SQL查询结果如何自动换行

oracle 查询按照中文排序

ORACLE 查询去重保留第一条排序

如何按 Oracle SQL IN() 子句中的值顺序对结果数据进行排序