SQL 排序依据:首先是特定值,然后是排序?

STa*_*mpa 7 sql case sql-order-by

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

我相信我的解释让大多数人感到困惑,所以这里有一个例子:在大多数情况下,我希望结果按列 B(日期)DESC 排序。但是,在某些情况下,我需要在日期排序上方(或之前)显示记录。当 A 列(状态)的值为“需要响应”时会发生这种情况。所以,如果 Status = 'Needs Response' 那么我需要它在结果的顶部,但是,如果它有任何其他值,它应该只按 DESC 顺序按日期排序。

在我尝试实现这一点时,我使用了 CASE 语句,但每次尝试都会导致所有结果按状态排序,然后按日期排序。我需要的是在状态值 = '需要响应' 时应用的初始顺序。

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
Run Code Online (Sandbox Code Playgroud)

使用上面相同的数据,无论我如何尝试,我总是首先得到按状态排序的数据,然后按日期排序。使用 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
Run Code Online (Sandbox Code Playgroud)

jar*_*rlh 13

使用case表达式将需要响应行放在首位。然后按日期降序排列:

order by case when status = 'Needs Response' then 0 else 1 end, date desc
Run Code Online (Sandbox Code Playgroud)


GMB*_*GMB 11

您应该能够使用如下ORDER BY子句来管理此问题:

ORDER BY 
    CASE WHEN Status = 'Needs Response' THEN 0 ELSE 1 END,
    Date desc
Run Code Online (Sandbox Code Playgroud)

所以基本上你会用两个字段进行排序:

  • 首先,当has value0时,计算得到的值;在所有其他情况下,它应该显示。这将允许状态首先出现,而所有其他值将具有相同的值,从而导致以下排序字段发挥作用StatusNeeds Response1Need Response

  • 然后Date