2014-09-02 97 views
0

我试图实现在使用CASE声明我的SQL查询ORDER BY子句中的“自定义”排序,但它给了我一些时髦的订货订购在SQL

这里是我的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 

我想要做的就是为了查询如下:

的人谁没有到达(谁的约会不会取消)和当前时间比过去相比的开始时间30分钟大 - 这些男人应该先

的人谁没有到达(谁的约会不会取消)和当前时间小于或等于过去的开始时间30分钟 - 这些家伙出现第二

接下来是大家谁检查在

随后取消预约

最后则一切

所有的一切都将开始时间和名称

订购

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

下面是我在结果得到的错误 - 我已经包含在ORDER BYCASE直观地看到这个问题

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()是8/28/2014 - 上面不应该有2状态。由于它不小于或等于StartDate后的30分钟
  2. 由于这本身是错误的,因此可能会导致第二个问题 - 因为它被标记为2,所以应该在3之前出现。
+0

将CASE语句移入SELECT子句,以便您可以清楚地看到结果。考虑分离ArrivalTime和CheckinStatus的逻辑。 – 2014-09-02 13:24:07

+2

由于您的2状态包括'ArrivalTime为空',因此您的第二行不可能有2状态。您的帖子中必须有错误。 – 2014-09-02 13:25:51

+0

请发布不仅仅是ORDER BY的完整查询。 – wdosanjos 2014-09-02 13:45:30

回答

0

我想这是基于您选择的列做订单,因为当你有一个查询

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

这将“由2,3订单”指订货基于empname查询,然后作为萨尔第二和第三列。检查选择列表中的列号。