SQL排序:特定值排在前面,然后再排序?

13

我有一个查询语句需要按照两个列排序结果。我的问题是,当特定值存在时,我只需要对第一列进行排序。否则,我希望结果按第二列排序。

我确定我的解释会让大多数人感到困惑,因此这里有一个例子:在大多数情况下,我希望按 Column B (Date) DESC 排序结果。但是,在某些情况下,我需要把记录显示在(或之前)日期排序之上。这发生在 Column A (Status) 的值为“Needs Response”时。所以,如果 Status = 'Needs Response',那么我需要它出现在结果的顶部,但如果它具有任何其他值,则仅按 Date in DESC order 排序。

为了实现这一点,我尝试使用 CASE 语句,但每次尝试都导致所有结果先按 Status 排序,然后再按 Date 排序。我需要的是仅在 Status 值 =“Needs Response”时应用初始排序。

Status         |  Date
---------------------------
Done           |  11/25/2018
Done           |  11/12/2018
Confirm        |  10/10/2018
Needs Response |  12/5/2018
Acknowledge    |  12/8/2018
Confirm        |  12/1/2018
Needs Response |  11/24/2018
Confirm        |  12/10/2018

使用上述相同的数据,无论我如何尝试,我总是首先按状态和日期排序数据。当使用CASE语句时,我能够将“需要回应”放在结果的顶部,但其余记录仍然按状态和日期排序。

我对示例数据的期望结果是:

Status         |  Date
---------------------------
Needs Response |  12/5/2018
Needs Response |  11/24/2018
Confirm        |  12/10/2018
Acknowledge    |  12/8/2018
Confirm        |  12/1/2018
Done           |  11/25/2018
Done           |  11/12/2018
Confirm        |  10/10/2018
2个回答

21
使用case表达式将“需要回复”行放在最前面,然后按日期降序排序。
order by case when status = 'Needs Response' then 0 else 1 end, date desc

没错,那个有效。我之前也做过类似的事情,但是我使用的是它父表中的数字ID而不是文本值“需要回复”。使用文本值效果很好。谢谢! - STampa

11

你应该能够通过 ORDER BY 子句来管理它,如下所示:


ORDER BY 
    CASE WHEN Status = 'Needs Response' THEN 0 ELSE 1 END,
    Date desc

基本上,您需要使用两个字段进行排序:

  • 首先是一个计算值,当Status的值为Needs Response时,它将为0;在所有其他情况下,它应该显示1。这将使Need Response状态首先出现,而所有其他值将具有相等的值,从而导致以下排序字段发挥作用

  • 然后是Date


虽然答案是一样的,但 SQL 的全大写语法和缩进使我能够将逻辑应用到自己的代码中。因此,我只给这个答案点了赞。 - Jesse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接