2017-08-24 84 views
0

我有一個簡單的案例表達式,運行在SQL服務器下面。我期待看到結果有超過12個HRS,超過25個HRS,超過45個HRS,等等。但是,我的結果只會返回超過12個HRS,少於12個HRS。請有人賜教我。在SQL中的案例表達式

謝謝, 喬

SELECT 
STORE, 
CASE 
WHEN HOURS >12 THEN 'Over 12 HRS' 
WHEN HOURS >25 THEN 'Over 25 HRS' 
WHEN HOURS >45 THEN 'Over 45 HRS' 
WHEN HOURS >55 THEN 'Over 55 HRS' 
WHEN HOURS >75 THEN 'Over 75 HRS' 
WHEN HOURS >94 THEN 'Over 94 HRS' 
ELSE    'Less 12 HRS' 
END    AS HOURS, 
COUNT (ID)   AS PRD 

FROM 
(
    SELECT 
    ID, 
    STORE, 
    HOURS 
    FROM TABLE A 
)X 
GROUP BY STORE, 
CASE 
WHEN HOURS >12 THEN 'Over 12 HRS' 
WHEN HOURS >25 THEN 'Over 25 HRS' 
WHEN HOURS >45 THEN 'Over 45 HRS' 
WHEN HOURS >55 THEN 'Over 55 HRS' 
WHEN HOURS >75 THEN 'Over 75 HRS' 
WHEN HOURS >94 THEN 'Over 94 HRS' 
ELSE    'Less 12 HRS' 
END 
+0

因爲它短路(聲明:大部分時間)。一旦它評估了第一個「真實」情況,它就會停止。因此,請嘗試改變'WHEN'的順序(當小時> 94 .....當小時> 75 ....' – Lamak

回答

0

這是因爲你下令在錯誤的道路的情況:當HOURS >94是真實的,也HOURS >12必須是真實的,所以HOURS >94一定要來HOURS >12之前。

一般來說,條件必須從較強到較弱,而不是相反。

重新排序列表中的相反的方式將解決此問題:

CASE 
WHEN HOURS >94 THEN 'Over 94 HRS' 
WHEN HOURS >75 THEN 'Over 75 HRS' 
WHEN HOURS >55 THEN 'Over 55 HRS' 
WHEN HOURS >45 THEN 'Over 45 HRS' 
WHEN HOURS >25 THEN 'Over 25 HRS' 
WHEN HOURS >12 THEN 'Over 12 HRS' 
ELSE    'Less 12 HRS' 
END AS HOURS 
+1

非常感謝ALL – joe

0

在第一個匹配行的case停止,所以13小時滿足所述第一條件,象23小時,和75小時,並等。

您需要反轉邏輯。一個簡單的方法是顛倒比較順序:

(CASE WHEN HOURS <= 12 THEN 'Less 12 HRS' 
     WHEN HOURS <= 25 THEN 'Over 12 HRS' 
     WHEN HOURS <= 45 THEN 'Over 25 HRS' 
     WHEN HOURS <= 55 THEN 'Over 45 HRS' 
     WHEN HOURS <= 75 THEN 'Over 55 HRS' 
     WHEN HOURS <= 94 THEN 'Over 75 HRS' 
     ELSE 'Over 94 HRS' 
END) AS HOURS, 

我還建議您重命名組。喜歡的東西:

(CASE WHEN HOURS <= 12 THEN '00-12 HRS' 
     WHEN HOURS <= 25 THEN '12-25 HRS' 
     WHEN HOURS <= 45 THEN '25-45 HRS' 
     WHEN HOURS <= 55 THEN '45-55 HRS' 
     WHEN HOURS <= 75 THEN '55-75 HRS' 
     WHEN HOURS <= 94 THEN '75-94 HRS' 
     ELSE '94+ HRS' 
END) AS HOURS, 
0

25,45,55,75,和94均大於12,所以這第一條件檢查的比賽,而且也沒有必要進一步評估所有。你想這樣寫:

CASE 
    WHEN HOURS >94 THEN 'Over 94 HRS' 
    WHEN HOURS >75 THEN 'Over 75 HRS' 
    WHEN HOURS >55 THEN 'Over 55 HRS' 
    WHEN HOURS >45 THEN 'Over 45 HRS' 
    WHEN HOURS >25 THEN 'Over 25 HRS' 
    WHEN HOURS >12 THEN 'Over 12 HRS' 
ELSE     'Less 12 HRS' 
END