SqlServer自定义排序

  在实际项目中,有时会碰到数据库SQL的特殊排序需求,举几个例子,作为参考。

1、自定义优先级

  一种常见的排序需求是指定某个字段取值的优先级,根据指定的优先级展示排序结果。比如如下表:

Create TABLE Fruit (id INT IDENTITY(1, 1) ,Name VARCHAR(50));INSERT  INTO Fruit (Name) VALUES  ('Apple');
INSERT  INTO Fruit (Name) VALUES  ('Watermelon');
INSERT  INTO Fruit (Name) VALUES  ('Strawberry');
INSERT  INTO Fruit (Name) VALUES  ('Banana');
INSERT  INTO Fruit (Name) VALUES  ('Pear');

  如果按照Name字段排序,结果是

Apple
Banana
Pear
Strawberry
Watermelon

  如果想把某个字段优先级提高,用如下方法:

select name from fruit 
order by case name when 'Strawberry' then 1when 'Banana' then 2when 'Apple' then 3 else 4
end

  指定了Strawberry、Banana、Apple三条记录的排序优先级,则这三个按照指定的结果排序,其他的都指定为4,排在后面。

Strawberry
Banana
Apple
Watermelon
Pear

  如果不指定else 4这句呢,结果如下:

Watermelon
Pear
Strawberry
Banana
Apple

  因为不指定就是NULL,在排序中,NULL的优先级最高,排在前面。

2、多字段关联排序

  考虑如下需求:有一个机构表,需要按照深度优先排序,也就是一个机构的下级机构和下下级机构的优先级比同级机构高。

  表结构有三个字段:机构号、机构名称、上级机构号:

branchnum	branchname	supbranchnum
1		本部	        00000
2		北京市分行    	00001
3		天津市分行    	00001
4		河北省分行    	00001
5		山西省分行    	00001
2001		北京中关村中心支行	00002
2002		北京王府井支行  	00002
2006		北京奥运村支行  	00002
2010		北京东城支行   	00002
2026		北京西城支行   	00002
2044		北京崇文支行   	00002
2061		北京宣武支行   	00002
2077		北京朝阳支行   	00002
2099		北京海淀支行   	00002
2135		北京丰台支行   	00002
2137		北京方庄中心支行 	00002
2154		北京首都机场支行 	00002
2160		北京通州支行   	00002
2169		北京大兴支行   	00002
2175		北京世纪财富中心支	00002
2178		北京顺义支行   	00002
2185		北京昌平支行   	00002
2194		北京平谷支行   	00002
2195		北京密云支行   	00002
2198		北京怀柔支行   	00002
2204		北京延庆支行   	00002
2206		北京金融中心支行 	00002
2209		北京中银大厦支行 	00002
2210		北京石景山支行  	00002
2211		北京商务区支行  	00002
2227		北京使馆区支行  	00002
2228		北京国际贸易中心支	00002
2231		北京上地支行	00002
2232		北京投资广场支行 	00002
2233		北京雅宝路支行  	00002
2354		天津大港支行   	00003
2361		天津和平支行   	00003
2382		天津河西支行   	00003
2398		天津南开支行   	00003
2412		天津红桥支行   	00003
2423		天津河北支行   	00003
2447		天津河东支行   	00003
2463		天津津南支行   	00003
2470		天津北辰支行   	00003
2478		天津东丽支行   	00003
2484		天津西青支行   	00003
2492		天津武清支行   	00003
2500		天津宝坻支行   	00003
2504		天津汉沽支行   	00003
2508		天津宁河支行   	00003
2510		天津蓟县支行   	00003
2519		天津静海支行   	00003
2523		天津津钢支行   	00003
2601		石家庄市机场路支行	00004
2626		石家庄市中山支行 	00004
2652		石家庄市裕东支行 	00004
2678		石家庄市裕华支行 	00004
3451		太原鼓楼支行   	00005
3479		太原平阳支行   	00005
3494		太原并州支行   	00005
3506		太原漪汾支行   	00005

  可以写一个排序函数,对每一个机构计算它的排序值,排序值就等于上级机构号:

Create FUNCTION fn_compare
(@Branchnum int
)
RETURNS int
AS
BEGINdeclare @returnVal intselect @returnVal=supBranchnum from Branch where Branchnum=@Branchnumif(@returnVal=1)Beginset @returnVal=@BranchnumEndreturn @returnVal
END
GO

  然后通过如下语句查询排序结构:

  select branchnum,branchname,supbranchnum from branchorder by dbo.fn_compare(branchnum),branchnum

  因为fn_compare函数中,对一个机构和它下级机构返回的排序值(ReturnVal)相等,所以为了使上级机构号排在下级机构前面,需要使用第二个排序字段Branchnum。排序结果如下:

branchnum	branchname	supbranchnum
1		本部	      00000
2		北京市分行    	 00001
2001		北京中关村中心支行	 00002
2002		北京王府井支行  	 00002
2006		北京奥运村支行  	 00002
2010		北京东城支行   	 00002
2026		北京西城支行   	 00002
2044		北京崇文支行   	 00002
2061		北京宣武支行   	 00002
2077		北京朝阳支行   	 00002
2099		北京海淀支行   	 00002
2135		北京丰台支行   	 00002
2137		北京方庄中心支行 	 00002
2154		北京首都机场支行 	 00002
2160		北京通州支行   	 00002
2169		北京大兴支行   	 00002
2175		北京世纪财富中心支  00002
2178		北京顺义支行   	 00002
2185		北京昌平支行   	 00002
2194		北京平谷支行   	 00002
2195		北京密云支行   	 00002
2198		北京怀柔支行   	 00002
2204		北京延庆支行   	 00002
2206		北京金融中心支行 	 00002
2209		北京中银大厦支行 	 00002
2210		北京石景山支行  	 00002
2211		北京商务区支行  	 00002
2227		北京使馆区支行  	 00002
2228		北京国际贸易中心支  00002
2231		北京上地支行	 00002
2232		北京投资广场支行 	 00002
2233		北京雅宝路支行  	 00002
20170		北京房山支行   	 00002
3		天津市分行    	 00001
2354		天津大港支行   	 00003
2361		天津和平支行   	 00003
2382		天津河西支行   	 00003
2398		天津南开支行   	 00003
2412		天津红桥支行   	 00003
2423		天津河北支行   	 00003
2447		天津河东支行   	 00003
2463		天津津南支行   	 00003
2470		天津北辰支行   	 00003
2478		天津东丽支行   	 00003
2484		天津西青支行   	 00003
2492		天津武清支行   	 00003
2500		天津宝坻支行   	 00003
2504		天津汉沽支行   	 00003
2508		天津宁河支行   	 00003
2510		天津蓟县支行   	 00003
2519		天津静海支行   	 00003
2523		天津津钢支行   	 00003
4		河北省分行    	 00001
2601		石家庄市机场路支行	 00004
2626		石家庄市中山支行 	 00004
2652		石家庄市裕东支行 	 00004
2678		石家庄市裕华支行 	 00004
5		山西省分行    	 00001
3451		太原鼓楼支行   	 00005
3479		太原平阳支行   	 00005
3494		太原并州支行   	 00005
3506		太原漪汾支行   	 00005

  

转载于:https://www.cnblogs.com/wangguanguo/p/8337715.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA 笔记(三)

NullPointerException:空指针异常 原因:数组已经不再指向堆内存了。而你还用数组名去访问元素。对于查找问题,如果找到就返回其索引值,如果找不到就要返回一个负数(一般是负一)这是必须的,否则如果找不到&a…

ERROR: SampleCB() - buffer sizes do not match 解决方法

笔记本有内置摄像头。Windows7驱动已经安装成功&#xff0c;利用QQ测试摄像头正常。但是利用OpenCV简单的摄像头操作后&#xff0c;就会出现ERROT: SampleCB() - buffer sizes do not match的问题。下面是代码&#xff1a; #include<iostream> #include <opencv2/co…

安装Wamp后 Apache无法启动的解决方法

安装Wamp后 Apache无法启动的解决方法&#xff0c;网上的解决方案可以说是五花八门&#xff0c;有些说了一大推&#xff0c;一点作用都起不到。 其实解决方法只需两步&#xff1a; 1、安装路径不能包含有中文&#xff0c;这个我不知道为什么&#xff0c;总之如果安装路径中包含…

MySQL的my.cnf文件(解决5.7.18下没有my-default.cnf)

官网说&#xff1a;从5.7.18开始不在二进制包中提供my-default.cnf文件。参考&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html 经过测试&#xff0c;在5.7.18版本中&#xff0c;使用tar.gz安装时&#xff0c;也就是压缩包解压出来安装这种&…

【Not all parameters were used in the SQL statement】

在添加游标的时候&#xff0c;添加preparedTrue cursor mydb.cursor(preparedTrue) 感谢博主&#xff1a; 【已解决】Python MySQL: Not all parameters were used in the SQL statement - MoonYear530 - 博客园一、事故缘起 今天构造了一个超过 50 多个参数的 SQL 插入语句…

opencv 文件模块 解析

OpenCV包括以下几个模块&#xff0c;具体功能是&#xff1a; 1、CV&#xff1a;主要的OpenCV函数 2、CVAUX&#xff1a;辅助的&#xff08;实验性的&#xff09;OpenCV函数 3、CXCORE&#xff1a;数据结构与线性代数支持 4、HIGHGUI&#xff1a;图像界面函数 5、ML&#xff1a;…

解决Android Studio报错:DefaultAndroidProject : Unsupported major.minor version 52.0

问题描述 今天使用Android Studio 2.0打开我之前的项目时&#xff0c;编译报了如下错误&#xff1a; Error:Cause: com/android/build/gradle/internal/model/DefaultAndroidProject : Unsupported major.minor version 52.0 其中build.gradle文件内容如下所示&#xff1a; // …

Alpha 通道的概念与功能

RGBA采用的颜色是RGB&#xff0c;可以属于任何一种RGB颜色空间&#xff0c;但是Catmull和Smith在1971至1972年间提出了这个不可或缺的alpha数值&#xff0c;使得alpha渲染和alpha合成变得可能。提出者以alpha来命名是源于经典的线性插值方程αA (1-α)B所用的就是这个希腊字母…

【ValueError: Target is multiclass but average=‘binary‘. Please choose another average setting, one 】

完整报错为&#xff1a;ValueError: Target is multiclass but averagebinary. Please choose another average setting, one of [None, micro, macro, weighted]. 解决方法 对于多分类任务&#xff0c;将 from sklearn.metrics import f1_score f1_score(y_test, y_pred) 改为…

debian apt-get联网安装mysql服务

安装mysql和卸载mysql 1.安装数据库&#xff1a;sudo apt-get install mysql-server 安装过程中需要设置密码。 2.安装客户端&#xff1a;sudo apt-get install mysql-client 3.登录MySQL&#xff1a;mysql -u root -p 4.配置文件&#xff1a;/etc/mysql/my.cnf a.设…

【资料下载区】【iCore、 iCore2相关资料】更新日期2017/1/11

【新产品发布】【iCore2 ARM / FPGA 双核心板】 【iCore系列核心板视频教程】之 SDRAM 读写实验 【iCore双核心组合是开发板例程】【uCGUI 例程及代码包下载】【iCore双核心组合是开发板例程】【12个 verilog 中级实验例程发布】【iCore、iCore2 双核心板】EPCS 实验&#xff0…

图像数据格式基础知识

JPEG文件格式简单分析 作者&#xff1a;小爽 摘要&#xff1a; 这篇文章大体上介绍了JPEG文件的结构信息以及它的压缩算法和编码方式。使读者能够对JPEG文件格式有大体上的了解。为读者进一步进行学习JPEG文件压缩做好准备 关键字&#xff1a;十六进制&#xff0c;段格式&am…

SQL语句:从一个表里按年份统计条目数

比如一个数据表名称叫deploypool&#xff0c; 需要知道里面每一年的记录数&#xff0c; 而add_date字段里有增加记录时的时间&#xff0c; 那么语句如下&#xff1a; SELECT EXTRACT(YEAR from add_date),COUNT(id) FROM deploypool GROUP BY EXTRACT(YEAR from add_date);

为什么需要架构图,怎么画?

Technorati 标签: 架构图,架构,交流,布局不知不觉中做架构师也已经4年了&#xff0c;最初的感觉只是一个名号&#xff0c;不再把代码作为强制的任务&#xff0c;后来开始慢慢的转变工作内容。画图&#xff0c;成为了我的主要工作。我可能不是每天都在写代码&#xff0c;但却是每…

Jenkins构建时间Poll Scm的设置(常用设置)

每15分钟构建一次&#xff1a;H/15 * * * * 或*/5 * * * * 每天8点构建一次&#xff1a;0 8 * * * 每天8点~17点&#xff0c;两小时构建一次&#xff1a;0 8-17/2 * * * 周一到周五&#xff0c;8点~17点&#xff0c;两小时构建一次&#xff1a;0 8-17/2 * * 1-5 每月1号、15号…

图像格式基础

所谓位映像&#xff0c;即是指一个二维的像素矩阵&#xff0c;而位图就是采用位映像方法显示和存储图像。一幅图像的显示就是将图像的像素映射到屏幕的像素上并显示一定的颜色。当一幅图形的像素由彩色表示时就是我们通常所说的彩色图像了。 由于数字图像可以表示为矩阵…

aop理解

1.切面&#xff08;Aspects&#xff09;常常通过通知&#xff08;advice&#xff09;、切点&#xff08;pointcuts&#xff09;和织入点&#xff08;join points&#xff09;来描述 2.通知&#xff08;advice&#xff09;有5种 Before——前置通知&#xff0c;在调用目标方法之…

Php 与 Json

PHP与JSON 在PHP中存在两个与JSON相关的函数&#xff1a; json_encode($array或$object)函数&#xff1a;把一个数组或对象转化为JSON格式的字符串 json_decode($json,$flag)函数&#xff1a;把一个JSON格式的字符串转化为数组或对象 $flag &#xff1a;true&#xff0c;代表转…

docker supervisor + compose

一&#xff1a; Supervisor Docker 容器在启动的时候开启单个进程&#xff0c;比如&#xff0c;一个 ssh 或者 apache 的 daemon 服务。但我们经常需要在一个机器上开启多个服务&#xff0c;这可以有很多方法&#xff0c;最简单的就是把多个启动命令放到一个启动脚本里面…

AngularJS(1)——入门学习

AngularJs相关概念 在w3schools中针对AngularJs的介绍为: AngularJS extends HTML with new attributes. AngularJS is perfect for Single Page Applications (SPAs). ProAuditObject ProAuditObj1 new ProAuditObject(); ProAuditObj1.setLproid(proId); Pr…