2014-09-02 125 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查詢,然後作爲薩爾第二和第三列。檢查選擇列表中的列號。