在SQL中排序

时间:2014-09-02 13:18:34

标签: sql sql-server sql-order-by

我正在尝试使用ORDER BY语句在我的SQL查询中的CASE子句中实现“自定义”排序,但它给了我一些时髦的排序

到目前为止,这是我的ORDER BY条款:

ORDER BY 
    CASE WHEN 
        CheckInStatus <> 'Cancelled' AND ArrivalTime is null AND GETDATE() > DATEADD(mi,30, CAST(StartDateTime AS DATETIME))THEN 1
    WHEN 
        CheckInStatus <> 'Cancelled' AND ArrivalTime is null AND GETDATE() <= DATEADD(mi,30, CAST(StartDateTime AS DATETIME)) THEN 2
    WHEN ArrivalTime is not null THEN 3
    WHEN CheckInStatus='Cancelled' THEN 4 
    ELSE 5
    END,
    StartDateTime, ScanTechName

我想要做的是按如下方式订购查询:

没有到达的人(以及谁的约会未被取消)和当前时间超过StartTime超过30分钟 - 这些人应该是第一个

未到达的人(以及谁的约会未被取消)和当前时间小于或等于StartTime之后的30分钟 - 这些人出现在第二位

接下来是签到的所有人

随后取消约会

最后是其他一切

所有内容都将按StartTime和Name

排序

问题似乎发生在2和3。这些家伙似乎混在一起,我认为这可能与我的AND有关,但我不知道如何解决它。

以下是我在搜索结果中遇到的错误 - 我已在CASE中加入了ORDER BY,以便直观地看到问题

Arrival Time            | CheckIn Status | StartDateTime           | OrderStatus
----------------------------------------------------------------------------------
2014-08-15 08:00:07.123 | Arrived        | 2014-08-15 07:15:00.000 | 3 
----------------------------------------------------------------------------------
2014-08-15 07:47:48.643 | Arrived        | 2014-08-15 07:30:00.000 | 2

所以发生了一些事情

  1. 由于我目前的GETDATE()是2014年8月28日 - 上面不应该有2个状态。因为它不小于或等于StartDate之后的30分钟
  2. 由于这本身就错了,所以可能导致第二个问题 - 因为它被标记为2,它应该出现在3之前而不是之后。

1 个答案:

答案 0 :(得分:0)

我猜它会根据您选择的列进行排序,因为当您有查询时

select empno, empname,sal from emp order by 2,3

它将根据empname命令查询,然后sal为“order by 2,3”表示第2和第3列。检查选择列表中的列号。