2008-12-19 4 views
4

J'ai un résultat d'une requête SQL que je voudrais trier alphabétiquement, mais il y a quelques résultats couramment utilisés que je voudrais faire flotter vers le haut. Existe-t-il un moyen simple d'y parvenir soit en faisant un SQL intelligent, soit en triant la datable (asp.net) une fois que je l'ai remplie?Comment puis-je trier un résultat SQL mais garder des résultats spéciaux?

Je connais l'ID de la base de données des choses que je veux garder en haut à l'avance si cela fait une différence.

Répondre

10

La meilleure façon de le faire est de trier par quelque chose qui définit les champs de côté des autres ...

En supposant que vous avez accès à modifier la structure de la table (que vous pouvez pas), puis ajouter un champ "collant" qui vous permet de marquer les éléments comme collants et joindre une commande aux articles collants si vous le souhaitez. Trier par ce champ avant le tri normal. Pour une astuce pour faire cela sans ce champ défini - vous auriez besoin de trier par certaines données que vous pouvez trouver dans ces champs ou maintenir les identifiants dans une table séparée - ou une liste dans votre requête ... pas la manière la plus idéale, mais cela fonctionnera.

+0

+1 pour faire de ces données conduit plutôt que la procédure entraînée –

+0

Convenu - ayant une colonne là-dedans qui maintient cet état est plus clair. D'un autre côté, si vous faites ceci pour générer une statistique totale ou calculée, les autres réponses peuvent vous aider. Ou, si vous utilisez des tables temporaires, alors cette réponse fonctionne bien, aussi –

+0

J'aime vraiment cette idée, surtout la commande dans les articles "collants". Vous pouvez utiliser une colonne pour cela, IE StickyOrder, et avoir les éléments collants réglés sur 1, 2 ou 3 et avoir les éléments "non collants" tous ensemble à la valeur 200 ou quelque chose. Ensuite, vous avez juste besoin d'une commande par StickyOrder ASC, Nom ASC –

4

Vous pouvez ajouter un champ d'addition appelé 'Spécial'. Special ne doit pas nécessairement exister dans la table, vous pouvez en déduire la requête comme bon vous semble. Puis suit sorte que:

ORDER BY Special DESC, Name ASC 

Ceci suppose bien entendu que vos lignes non spéciales seraient 0, et le champ alphabétique est appelé « Nom »

6

vous pouvez définir une colonne personnalisée qui définit un « spécial drapeau "que vous pouvez trier par. Ensuite, triez par la colonne alphabétique.

SELECT ... 
    IsSpecial = CASE WHEN RowID IN (100,534,203) THEN 1 ELSE 0 END 
FROM ... 
ORDER BY IsSpecial DESC, RowID ASC, Name ASC 
2

Pour ajouter à @EndangeredMassa:

Vous pouvez également faire quelque chose de similaire si vous faites déjà les syndicats:

SELECT 0 QueryType, Desc, GrandTotal 
FROM YourTable 

UNION ALL 

SELECT 1 QueryType, Desc, LineItems 
FROM YourTable 

ORDER BY QueryType, Desc 

Note: les syndicats peuvent ne pas être idéal dans cet exemple ... il est juste un Exemple!

+0

Voilà ce que je travaillais à .... et fluffed, trop de hâte! – Kev

5

ordre juste par une déclaration de cas qui utilise tout ce que vous ... les règles définissent

... 
    Order By Case 
     When [My Rules that designate special] 
     Then 0 Else 1 End 
+0

C'est plus simple. J'ai oublié les conditions dans les sections WHEN. – EndangeredMassa

+0

+1 pour une bonne solution. Résolu mon problème. –