Ordre de résultat personnalisé avec UNION – TSQL

J'ai une tâche assez simple dans laquelle j'ai besoin de sélectionner des lignes avec un champ particulier avec une valeur de 1 en premier, puis une valeur de 2 et enfin toutes les autres lignes avec une valeur de 0.

J'utilise une jointure pour get quels éléments sont membres de quelle catégorie. Je pensais que l'exécution de 3 sélections et l'utilisation d'une union se combinerait à des résultats dans le bon ordre, mais j'avais tort 🙂

Mon SQL est le suivant:

SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 1 UNION SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 2 UNION SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 0 

Mes résultats ne sont pas sortis avec 1, puis 2 et puis 0 .. Qu'est-ce que je fais mal ici ??

* SOLUTION * Merci pour l'aide les gars. Voici le SQL final que j'utilise.

 SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category ORDER BY CASE tblcompany.intpremium WHEN 1 THEN 0 WHEN 2 THEN 1 WHEN 0 THEN 2 END 

La déclaration UNION, comme tous les bons opérateurs, est agnostique quand il s'agit de order des données.

Cependant, vous pouvez exécuter une instruction select avec une instruction ORDER BY soigneusement conçue, telle que:

 ... ORDER BY CASE tblCompany.IntPremium WHEN 1 THEN 0 WHEN 2 THEN 1 WHEN 0 THEN 2 END 

La command ne se produit pas dans l'ordre de vos instructions select dans une clause union. La chose la plus simple à faire est d'append une command en:

 SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 1 UNION SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 2 UNION SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 0 ORDER BY CASE intpremium WHEN 1 THEN 1 WHEN 2 THEN 2 WHEN 0 THEN 3 END 

Vous devrez append une colonne aux trois instructions select, avec une valeur littérale qui "catégorise" les résultats. Puis commandz par sur cette colonne.