2017-08-24 3 views
0

Ich habe einen einfachen Fall Ausdruck, der in SQL-Server läuft unten. Ich hatte erwartet, dass das Ergebnis über 12 Stunden, über 25 Stunden, über 45 Stunden usw. sein wird. Jedoch gibt mein Ergebnis nur über 12 Stunden und weniger 12 Stunden. Würde mich jemand bitte aufklären?Case Expression in SQL

Danke, Joe

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

weil es kurzschließt (Disclaimer: die meiste Zeit). Sobald es die erste "wahre" Bedingung auswertet, stoppt es. Versuchen Sie also, die Reihenfolge Ihrer WHEN's zu ändern (WANN STUNDEN> 94 ..... WANN STUNDEN> 75 .... ' – Lamak

Antwort

0

Dies geschieht, weil man die Fälle, in die falsche Art und Weise bestellt: wenn HOURS >94 wahr ist, muss HOURS >12 auch wahr sein, so muss HOURS >94 kommen vor HOURS >12.

Im Allgemeinen müssen Bedingungen von stärker zu schwächer bestellt werden, nicht umgekehrt.

Neuordnen der Liste die entgegengesetzte Richtung wird dieses Problem beheben:

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

Vielen Dank an ALLE – joe

0

Die case hält an der ersten passenden Zeile, so 13 Stunden erfüllt die erste Bedingung, ebenso wie 23 Stunden und 75 Stunden und so weiter .

Sie müssen die Logik umkehren. Eine einfache Möglichkeit besteht darin, die Vergleichsreihenfolge umzukehren:

(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, 

Ich würde auch vorschlagen, dass Sie die Gruppen umbenennen. Etwas wie:

(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 und 94 sind alle größer als 12 so dass die erste Scheck Streichhölzer Zustand, und es gibt keine Notwendigkeit, weiter zu bewerten. Sie möchten es so schreiben:

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