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.pswp.cn/news/255614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255614.shtml
英文地址,請注明出處:http://en.pswp.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…