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

时间:2018-12-10 20:35:20

标签: sql sql-order-by case

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

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

在尝试完成此操作时,我使用了CASE语句,但每次尝试都会导致所有结果按Status排序,然后按 then 按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语句时,我可以在结果的顶部获得“需求响应”,但其余记录仍按Date之前的Status排序。

我期望的样本数据结果将是:

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 个答案:

答案 0 :(得分:3)

使用case表达式将“需求响应”行放在第一位。然后按日期降序排列:

order by case when status = 'Needs Response' then 0 else 1 end, date desc

答案 1 :(得分:1)

您应该可以使用ORDER BY子句来管理它,例如:

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

因此,基本上,您将使用两个字段进行排序:

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

  • 然后Date