全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2518
推到 Plurk!
推到 Facebook!

SQL語法排序的問題?

答題得分者是:senso
大武士
一般會員


發表:3
回覆:11
積分:7
註冊:2010-09-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-01-22 11:31:09 IP:60.249.xxx.xxx 訂閱
前輩大家好!!
以下是我排序的問題...

資料庫: Sybase
欄位A欄位B
777標記
777
999
999
標記
標記
標記

因條件必須變成
欄位A欄位B
777標記
777
標記
標記
標記
999
999

或者
欄位A欄位B
標記
標記
標記
777標記
777(標記也可在這)
999
999



問題:
條件1.欄位A內數字777或999 相同的兩個數字必須在一起(中間不可有空格) 但可以與不同數字分開!!

2.標記"必須"在最上面或者像是有777跟標記這兩種條件成立的下方

3.999因為沒有標記所以必須在標記以下 !!

4.最大的問題點: 其中有一個欄位 A 777 有標記....

5.欄位內值 "標記" 不會變~一定是此值!!

6.若我只下欄位A DESC 就會變成 777有標記的在最上面 但連帶999也會跟著跑上去 就其他的標記會跟在 999下方

若我只下欄位B DESC 就會變成 有標記的都在最上面 但連帶777 會散開

若我下 欄位A DESC 跟 欄位B DESC ......那 777會散開

7.必須比對資料庫,所以一但使用where 會篩選資料庫會造成資料錯誤....

8.sorry前輩 ...補上一點 數字 777 999 數字會隨著時間.........增加再加上 666 888.....

若時間越久 數字就不同如 777 778 779 880 881 882 883...............999 等等之類的依此類推


我下SQL語法

select 欄位A ,欄位B
from 資料表
order by 欄位A desc,欄位B desc
就造成我以上的問題~~

有辦法可達成兩種這種格式嗎? 排序的方法?

....潛水 爬山 中.....

懇請前輩指教後輩 ~隨意隨緣 感激不盡~謝謝 !!
編輯記錄
大武士 重新編輯於 2011-01-21 20:36:44, 註解 無‧
大武士 重新編輯於 2011-01-21 20:53:02, 註解 無‧
大武士 重新編輯於 2011-01-21 21:16:00, 註解 無‧
大武士 重新編輯於 2011-01-24 17:30:31, 註解 無‧
大武士 重新編輯於 2011-01-25 00:44:09, 註解 無‧
大武士 重新編輯於 2011-01-25 00:49:01, 註解 無‧
frappe
中階會員


發表:88
回覆:114
積分:95
註冊:2008-10-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-01-24 00:40:46 IP:220.133.xxx.xxx 訂閱
如果是我,我會相把資料拆開成幾個Select命令,順便加上自定的排序欄位,
最後再用Union ALL組裝起來,這樣不管怎麼排都排得出來~

sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-01-24 09:42:37 IP:122.121.xxx.xxx 訂閱
抱歉,我想錯了,刪除!
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2011-01-23 18:49:20, 註解 無‧
大武士
一般會員


發表:3
回覆:11
積分:7
註冊:2010-09-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-01-24 12:58:43 IP:60.249.xxx.xxx 訂閱
感謝指導 我再試看看!!
目前進度還在試..........(未出)
正在嘗試...
===================引 用 frappe 文 章===================
如果是我,我會相把資料拆開成幾個Select命令,順便加上自定的排序欄位,
最後再用Union ALL組裝起來,這樣不管怎麼排都排得出來~

大武士
一般會員


發表:3
回覆:11
積分:7
註冊:2010-09-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-01-24 13:01:38 IP:60.249.xxx.xxx 訂閱
抱歉前輩  
因為我才剛看到..20100124 下午12:55分
所以不知道之前的發文~
或許可解決!!

因為可能我的表達有些許的錯誤!!~
不知前輩之前的文是?



謝謝您!!
===================引 用 sryang 文 章===================
抱歉,我想錯了,刪除!
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-01-25 04:16:01 IP:202.39.xxx.xxx 訂閱
請試試看!

SELECT DECODE(欄位A,NULL,'#',欄位B) Col2
FROM 資料表
ORDER BY 1,2 DESC;
因字串比較時, NULL 被當做最大字串, 故轉 '#' 代表).
或將欄位 Type 定義為定長者 (例如: CHAR(3)), 則不填資料便是3個空白, 而非 NULL.

senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-01-25 11:22:02 IP:61.219.xxx.xxx 訂閱
Sybase我沒用過,排序應該都大同小異吧

這邊我用access寫
查詢1
欄位B
標記
777777
999

SELECT 資料表.欄位A, 資料表.欄位B
FROM 資料表
ORDER BY 資料表.欄位A, 資料表.欄位B DESC;

ORDER BY 資料表.欄位B DESC , 資料表.欄位A;

查詢3
欄位B
標記
777
標記
999
ORDER BY 資料表.欄位A, 資料表.欄位B;

查詢4
欄位B
標記
標記
標記
999
ORDER BY IIf(資料表.欄位A="777",0,4) IIf(資料表.欄位B="標記",1,2);
簡單的說就是把欄位跟值設個權重排序
大武士
一般會員


發表:3
回覆:11
積分:7
註冊:2010-09-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-01-25 15:45:03 IP:60.249.xxx.xxx 訂閱
前輩抱歉
忘了說 資料庫 版本!!~
前輩謝謝!!
===================引 用 herbert2 文 章===================
請試試看!

SELECT DECODE(欄位A,NULL,'#',欄位B) Col2
FROM 資料表
ORDER BY 1,2 DESC;
因字串比較時, NULL 被當做最大字串, 故轉 '#' 代表).
或將欄位 Type 定義為定長者 (例如: CHAR(3)), 則不填資料便是3個空白, 而非 NULL.

編輯記錄
大武士 重新編輯於 2011-01-25 01:05:29, 註解 無‧
大武士
一般會員


發表:3
回覆:11
積分:7
註冊:2010-09-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-01-25 16:51:59 IP:60.249.xxx.xxx 訂閱
謝謝senso
我的疏忽忘了說 這只是個比如
而數字部分會已遞增狀態輸入
那標記不會變

所以內容如下!!~

標記
標記
標記
1
2
3
.
.
.
665
666
667
.
.
777 標記
.
998
999

謝謝!!

===================引 用 senso 文 章===================
Sybase我沒用過,排序應該都大同小異吧

這邊我用access寫
查詢1
欄位B
標記
777777
999

SELECT 資料表.欄位A, 資料表.欄位B
FROM 資料表
ORDER BY 資料表.欄位A, 資料表.欄位B DESC;

ORDER BY 資料表.欄位B DESC , 資料表.欄位A;

查詢3
欄位B
標記
777
標記
999
ORDER BY 資料表.欄位A, 資料表.欄位B;

查詢4
欄位B
標記
標記
標記
999
ORDER BY IIf(資料表.欄位A="777",0,4) IIf(資料表.欄位B="標記",1,2);
簡單的說就是把欄位跟值設個權重排序
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-01-25 17:02:05 IP:61.219.xxx.xxx 訂閱
decode是oracle function
google一下sybase應該可以用case when,(oracle也有case when)

剛才測一下order by asc的時候access和mssql的null的row都會在上面......
oracle的null的row都會在下面....

可以試試看這樣
order by (case when 資料表.欄位A is null then 0 else 資料表.欄位A end) asc,資料表.欄位B asc
欄位A is null在上面再照值排序,在欄位A相同時欄位B有標記在上面
編輯記錄
senso 重新編輯於 2011-01-25 02:17:51, 註解 無‧
大武士
一般會員


發表:3
回覆:11
積分:7
註冊:2010-09-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-01-27 22:17:17 IP:220.129.xxx.xxx 訂閱
senso frappe sryang herbert2


謝謝你們熱心相助!!~

這幾天再測試...(快)成功了!!~

先在此感謝各位前輩協助

新年即將到來

在此祝賀 健康如意 平安順心

再次謝謝 !!


===================引 用 senso 文 章===================
decode是oracle function
google一下sybase應該可以用case when,(oracle也有case when)

剛才測一下order by asc的時候access和mssql的null的row都會在上面......
oracle的null的row都會在下面....

可以試試看這樣
order by (case when 資料表.欄位A is null then 0 else 資料表.欄位A end) asc,資料表.欄位B asc
欄位A is null在上面再照值排序,在欄位A相同時欄位B有標記在上面
系統時間:2024-04-26 13:10:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!