web-dev-qa-db-fra.com

Instruction CASE WHEN pour la clause ORDER BY

J'utilise SQL Server 2008 R2. 

Je veux le tri basé sur la priorité pour les enregistrements dans une table. 

Donc, j'utilise l'instruction CASE WHEN dans la clause ORDER BY. La clause ORDER BY est comme ci-dessous: 

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

Mais cela donne Incorrect syntax near the keyword 'desc' 

Toute solution? 

Je peux aussi avoir TblList.PinRequestCount <> 0 et TblList.HighCallAlertCount <> 0 et TblList.HighAlertCount <> 0 et TblList.MediumCallAlertCount <> 0 et TblList.MediumAlertCount <> 0 en même temps.

25
Dev

CASE est un expression - il renvoie une valeur scalaire single (par ligne). Il ne peut pas renvoyer une partie complexe de l'arbre d'analyse de quelque chose d'autre, comme une clause ORDER BY d'une instruction SELECT.

On dirait que vous avez juste besoin de:

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

Ou éventuellement:

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

Il est un peu difficile de dire lequel des éléments ci-dessus (ou autre chose) correspond à ce que vous recherchez, car vous avez a) pas expliqué quel ordre de tri réel vous essayez d'atteindre et b) non fourni tout échantillon de données et les résultats attendus, à partir desquels nous pourrions essayer de déduire l'ordre de tri réel que vous essayez d'atteindre.


C'est peut-être la réponse que nous recherchons:

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

Un autre exemple simple de ici ..

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

Vous devez mettre END pour finaliser chaque CAS (avant desc)

0
Szymon