2008-12-19 61 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