Sql Order By … en utilisant `Case When` pour différentes commands ascendantes, descendantes et personnalisées

Je veux sortinger le produit par remise à certaines conditions

ORDER BY CASE WHEN @OrderBy = 0 THEN table.id END ASC, CASE WHEN @Orderby = 2 THEN table.id END ASC, 

Je veux faire quelque chose comme ci-dessous car je n'ai pas de colonne de réduction dans le tableau

 CASE WHEN @OrderBy = 4 THEN (100-((table.price/table.oldprice)*100) as discount END ASC 

mais il jette une erreur – comment puis-je sortinger par remise?

Il y a quelques problèmes, par exemple Vous ne pouvez pas alias un champ de calcul dans un ordre par, et vous aurez besoin d'échapper le nom de votre table, fixer le cae , et countr les parenthèses.

Aussi, comme il semble que vous voulez juste CASE sur une seule variable, vous pouvez déplacer le @OrderBy vers le haut de la CASE, comme ceci:

 SELECT * from [table] ORDER BY CASE @OrderBy WHEN 0 THEN [table].id -- ASC WHEN 2 THEN [table].id * -1 -- DESC ---I want to do something like below as I don't have discount column in table WHEN 4 THEN (100-([table].price/[table].oldprice)*100) END 

SqlFiddle ici

En aparté, si vous avez besoin de changer dynamicment ASC ou DESC d'une colonne, vous pouvez utiliser un hack comme celui-ci en multipliant par -1.

(Notez aussi que ORDER BY CASE ... END ASC, CASE ... END ASC va définir les premier et second ordres … cela ne semble pas logique étant donné que @OrderBy ne peut avoir qu'une seule valeur)

Il me semble que vous avez besoin de quelque chose de similaire à cela

 select * from TableName where someCondition >100 order by case when @OrderBy = 'AirlineService' then AirlineService END desc, case when @OrderBy = 'SomeMore' then MyOtherColumn end GO 

Si vous n'avez pas de coulmn, vous ne pouvez pas sortinger avec ça. Veuillez lire ce lien Microsoft Veuillez garder à l'esprit: spécifie l'ordre de sorting utilisé pour les colonnes renvoyées dans une instruction SELECT. J'espère que cela aide.

Ne pas calculer la remise dans la clause ORDER BY mais dans le SELECT

 SELECT *, (100-(table.price/table.oldprice))*100 as discount FROM table 

 ORDER BY CASE WHEN @OrderBy = 0 THEN table.id END ASC, CASE when @orderby=2 THEN table.id END ASC, CASE WHEN @OrderBy = 4 THEN discount END ASC