it-swarm.com.de

CASE WHEN-Anweisung für die ORDER BY-Klausel

Ich verwende SQL Server 2008 R2. 

Ich möchte die prioritätsbasierte Sortierung für Datensätze in einer Tabelle. 

Daher verwende ich die CASE WHEN-Anweisung in der ORDER BY-Klausel. Die ORDER BY-Klausel lautet wie folgt: 

ORDER BY 
CASE WHEN TblList.PinRequestCount <> 0 THEN TblList.PinRequestCount desc, TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC END, 
CASE WHEN TblList.HighCallAlertCount <> 0 THEN TblList.HighCallAlertCount desc, TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC END,
Case WHEN TblList.HighAlertCount <> 0 THEN TblList.HighAlertCount DESC, TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC END,
CASE WHEN TblList.MediumCallAlertCount <> 0 THEN TblList.MediumCallAlertCount DESC, TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC END,
Case WHEN TblList.MediumAlertCount <> 0 THEN TblList.MediumAlertCount DESC, TblList.LastName ASC, TblList.FirstName ASC, Patlist.MiddleName ASC END

Aber es gibt Incorrect syntax near the keyword 'desc' 

Irgendeine Lösungsmöglichkeit? 

Ich kann auch TblList.PinRequestCount <> 0 und TblList.HighCallAlertCount <> 0 und TblList.HighAlertCount <> 0 und TblList.MediumCallAlertCount <> 0 und TblList.MediumAlertCount <> 0 gleichzeitig haben.

25
Dev

CASE ist ein Ausdruck - es gibt einen single - Skalarwert (pro Zeile) zurück. Sie kann keinen komplexen Teil des Parsing-Baums von etwas anderem zurückgeben, beispielsweise eine ORDER BY-Klausel einer SELECT-Anweisung.

Es sieht so aus, als müssten Sie einfach nur:

ORDER BY 
CASE WHEN TblList.PinRequestCount <> 0 THEN TblList.PinRequestCount END desc,
CASE WHEN TblList.HighCallAlertCount <> 0 THEN TblList.HighCallAlertCount END desc, 
Case WHEN TblList.HighAlertCount <> 0 THEN TblList.HighAlertCount END DESC,
CASE WHEN TblList.MediumCallAlertCount <> 0 THEN TblList.MediumCallAlertCount END DESC,
Case WHEN TblList.MediumAlertCount <> 0 THEN TblList.MediumAlertCount END DESC,
TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC

Oder möglicherweise:

ORDER BY 
CASE
   WHEN TblList.PinRequestCount <> 0 THEN TblList.PinRequestCount
   WHEN TblList.HighCallAlertCount <> 0 THEN TblList.HighCallAlertCount
   WHEN TblList.HighAlertCount <> 0 THEN TblList.HighAlertCount
   WHEN TblList.MediumCallAlertCount <> 0 THEN TblList.MediumCallAlertCount
   WHEN TblList.MediumAlertCount <> 0 THEN TblList.MediumAlertCount
END desc,
TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC

Es ist ein bisschen schwierig zu sagen, welche der oben genannten (oder etwas anderen) Sie suchen, weil Sie a) nicht erklärt welche Sortierreihenfolge Sie tatsächlich erreichen wollen, und b) hat keine Beispieldaten und erwarteten Ergebnisse geliefert, aus denen wir versuchen könnten, abzuleiten die tatsächliche Sortierreihenfolge, die Sie erreichen möchten.


Dies könnte die Antwort sein, nach der wir suchen:

ORDER BY 
CASE
   WHEN TblList.PinRequestCount <> 0 THEN 5
   WHEN TblList.HighCallAlertCount <> 0 THEN 4
   WHEN TblList.HighAlertCount <> 0 THEN 3
   WHEN TblList.MediumCallAlertCount <> 0 THEN 2
   WHEN TblList.MediumAlertCount <> 0 THEN 1
END desc,
CASE
   WHEN TblList.PinRequestCount <> 0 THEN TblList.PinRequestCount
   WHEN TblList.HighCallAlertCount <> 0 THEN TblList.HighCallAlertCount
   WHEN TblList.HighAlertCount <> 0 THEN TblList.HighAlertCount
   WHEN TblList.MediumCallAlertCount <> 0 THEN TblList.MediumCallAlertCount
   WHEN TblList.MediumAlertCount <> 0 THEN TblList.MediumAlertCount
END desc,
TblList.LastName ASC, TblList.FirstName ASC, TblList.MiddleName ASC
44

Ein weiteres einfaches Beispiel aus hier ..

SELECT * FROM dbo.Employee
ORDER BY 
 CASE WHEN Gender='Male' THEN EmployeeName END Desc,
 CASE WHEN Gender='Female' THEN Country END ASC
6
nagnath

Sie müssen END setzen, um jeden CASE abzuschließen (vor der Abnahme)

0
Szymon