Comment order par certaines colonnes d'abord dans une union select

Je fais une SELECT à partir de plusieurs tables, mais je veux d'abord ORDER BY un set de critères. Voici un exemple de l' SELECT :

 SELECT a.ItemName, a.ItemDescription, a.ItemPrice, a.DateAdded, a.UserID, u.UserType FROM table a inner join user u ON u.UserID = a.UserID UNION SELECT b.ItemName, b.ItemDescription, b.ItemPrice, b.DateAdded, b.UserID, u.UserType FROM table b inner join user u ON u.UserID = b.UserID UNION SELECT c.ItemName, c.ItemDescription, c.ItemPrice, c.DateAdded, c.UserID, u.UserType FROM table c inner join user u ON u.UserID = c.UserID 

À partir du jeu de résultats ci-dessus, je voudrais d'abord ORDER BY where u.UserType = 'Consultant' and DateAdded DESC, and then by u.UserType = 'Internal' and Price DESC and DateAdded DESC .

Comment pourrais-je forcer le sorting de la manière ci-dessus?

Vous pouvez le faire en utilisant le case

 Order by case when u.UserType = 'Consultant' then 1 else 0 end, DateAdded desc, case when u.UserType = 'Internal' then 1 else 0 end, Price desc, DateAdded desc 

Sans données DDL et Sample à tester, c'est un peu une supposition, mais peut-être …

 ORDER BY CASE UserType WHEN 'Consultant' THEN 1 END DESC, DateAdded DESC, CASE UserType WHEN 'Internal' THEN 1 END DESC, Price DESC, DateAdded DESC; 

Modifier, lors de la relecture, je ne suis pas tout à fait sûr que c'est ce que veut le PO. L'échantillon et la sortie attendue seraient utiles si moi et Magnus sont incorrects.

Première command par un consultant ou non. Ensuite, commandz par prix (mais pas pour les consultants, donc pour eux order par un pseudo prix constant). Ensuite, commandz par date ajoutée.

 order by case when usertype = 'Consultant' then 1 else 2 end, case when usertype = 'Consultant' then 0 else price end desc, dateadded desc; 

Cela a d'abord les consultants (classés par date ajoutée), suivi de tous les autres (classés par prix et date ajoutée).

S'il existe plus de types d'users que les deux que vous avez mentionnés et que vous voulez d'abord des consultants, puis des internes, puis d'autres, vous devrez modifier la première command line en conséquence:

 order by case usertype when 'Consultant' then 1 when 'Internal' then 2 else 3 end, case when usertype = 'Consultant' then 0 else price end desc, dateadded desc;