2008-12-19 42 views
4

我有一個SQL查詢的結果,我想按字母順序排序,但有一些常用的結果,我想漂浮在頂部。 有沒有一種簡單的方法,我可以通過做聰明的SQL或通過排序(asp.net)數據表一旦我有它填充?如何排序SQL結果但保留一些特殊的結果?

我知道我想保留在頂端的事情的數據庫ID,如果這有所作爲。

回答

10

做到這一點,最簡單的方法是通過一些設置這些字段除了其他排序...

在假設你有機會修改表的結構(您可能不),然後添加一個「粘性」字段,它允許您將項目標記爲粘性,並且如果您喜歡,可將訂單附加到粘性物品上。常規排序之前按此字段進行排序。

至於如何在沒有定義字段的情況下做到這一點 - 您需要按照您在這些字段中找到的某些數據進行排序,或將ID保留在單獨的表中 - 或者查詢中的列表...不是最理想的方式,但它會奏效。

+0

+1使這一數據驅動而不是流程驅動 – 2008-12-19 17:37:28

+0

同意 - 在那裏有一列維持這種狀態清晰。另一方面,如果你這樣做來產生一個總計或一些計算的統計數據,其他答案可以提供幫助。或者,如果您使用的是臨時表格,那麼這個答案也能正常工作 – 2008-12-19 17:41:33

+0

我非常喜歡這個想法,尤其是「粘性」項目內的排序。您可以使用一列,IE StickyOrder,並將粘性項目設置爲1,2或3,並將「非粘性」項目設置爲值200或其他值。那麼你只需要一個由StickyOrder ASC命令,名稱ASC – 2008-12-19 17:52:43

4

您可以添加一個名爲'Special'的加法字段。特殊表不一定實際存在於表中,但是您可以派生出您認爲合適的查詢。然後排序如下:

ORDER BY Special DESC, Name ASC 

當然,這假定您的非特殊的行會是0,字母字段稱爲「名稱」

6

你可以定義設置了一個「特殊的自定義列標誌「,你可以排序。然後,按字母順序排列。

SELECT ... 
    IsSpecial = CASE WHEN RowID IN (100,534,203) THEN 1 ELSE 0 END 
FROM ... 
ORDER BY IsSpecial DESC, RowID ASC, Name ASC 
2

要添加到@EndangeredMassa:

你也可以做同樣的事情,如果你已經在做工會:

SELECT 0 QueryType, Desc, GrandTotal 
FROM YourTable 

UNION ALL 

SELECT 1 QueryType, Desc, LineItems 
FROM YourTable 

ORDER BY QueryType, Desc 

注:工會可能不會在這個例子中理想......它只是一個例!

5

公正的秩序由使用的任何規則你指定一個case語句......

... 
    Order By Case 
     When [My Rules that designate special] 
     Then 0 Else 1 End