2010-03-19 5 views
0

I ont une procédure stockée qui fait essentiellement quelque chose commeTri des résultats par un char (1) colonne

select top 1 expiryDate, flag, (bunch of other columns) 
from someTable 
(bunch of joins) 
order by expiryDate desc 

cette saisira donc le dossier qui expire en dernier. Cela fonctionne pour la plupart des cas, sauf certains enregistrements ont un drapeau qui sont juste un char(1). La plupart du temps c'est juste Y ou N.

Donc ça va revenir quelque chose comme

2010-12-31 N 
2010-10-05 Y 
2010-08-05 N 
2010-03-01 F 
2010-01-31 N 

Cela fonctionne, la plupart du temps, mais est-il possible de le commander par la colonne de drapeau ainsi? Donc, je voudrais regrouper les résultats par Y, puis N, et F et tous les autres drapeaux peuvent aller en dernier dans n'importe quel ordre. Je pensais que ce serait juste un ordre par, mais puisque les drapeaux ne sont pas pondérés par la valeur alphabétique, je suis un peu perplexe. (Note: Ce ne sont pas mes tables, je ne sais pas si utiliser les personnages comme ça était une bonne idée ou pas, mais ce n'est pas quelque chose que je peux changer).

+0

Vous voulez briser l'égalité des valeurs cravate de ExpiryDate avec le drapeau? – gbn

+0

@gbn, il est peu probable que expiryDates soit égal (si c'est important), mais oui. Je voudrais que celui marqué "Y" avant l'un des autres. – Brandon

+0

Donc c'est la question: le tri secondaire/tie break? Le TOP 1 donne le dernier expiryDate c'est tout, mais la question met l'accent sur les drapeaux et les groupements – gbn

Répondre

3

Vous avez besoin de l'aide d'une instruction CASE

Order By expiryDate desc, 

    CASE flag 
     When 'Y' THEN 1 
     When 'N' THEN 2 
     When 'F' THEN 3 
     ELSE 999 
    END ASC 
-1

Vous pouvez commander plusieurs colonnes:

select top 1 expiryDate, flag, (bunch of other columns) 
from someTable 
(bunch of joins) 
order by flag /* asc/desc */, expiryDate desc 
Questions connexes