Question

Disons que ma relation est comme ça

enter image description here

et je voulais trier par rang, mais les A et les B en premier.Donc ma relation ressemblera à

enter image description here

Au début, j'ai essayé d'avoir juste deux relations, où je les classe toutes les deux par rang, puis j'unis les deux relations, mais elles finissent par se mélanger.J'ai également essayé d'utiliser des cas, mais je ne comprends pas comment cela fonctionne.J'ai continué à recevoir des erreurs concernant le mélange de caractères avec des nombres entiers.

Modifier:J'ai oublié de mentionner que la première relation ci-dessus est celle avec laquelle je me retrouve après un nombre de vues quelque peu complexe.Par exemple, j'ai créé deux vues, une qui n'a que des classes A et B, puis je les ai classées par rang.Deuxième vue, uniquement les classes C, classées par rang.Ensuite, je les ai réunis, mais ils se mélangent simplement.

Était-ce utile?

La solution

Vous avez seulement besoin d'un CASE expression dans le ORDER BY, pour diviser les lignes en deux groupes, de sorte que celles de classe 'A' ou 'B' soient placées dans le premier groupe (1) et tous les autres dans la seconde (2):

ORDER BY 
    CASE WHEN class IN ('A', 'B') THEN 1 ELSE 2 END,
    rank ;

Autres conseils

Je vais vous donner un exemple de façon de procéder, où j'utilise les CTE, qui sont disponibles dans de nombreuses bases de données, en particulier PostgreSQL que je connais le mieux.

Les CTE et les WITH clause

CTE vous permettent de former des structures temporaires de type table à requête unique, mais comme vous pouvez faire en sorte que les CTE s'appuient les uns sur les autres dans une seule requête, cela fournit un moyen pratique et facile à comprendre de rendre votre requête semi-procédurale.

Dans ton cas, j'essaierais

WITH AB_results AS(
  SELECT class, rank, 1 AS hidden_rank
  FROM my_relation
  WHERE class IN ('A','B')
),
Non_AB_results AS(
  SELECT class, rank, 2 AS hidden_rank
  FROM my_relation
  WHERE class NOT IN ('A','B')
)
SELECT COALESCE(AB_results.class,Non_AB_results.class), rank
FROM AB_results
FULL OUTER JOIN Non_AB_results
USING(hidden_rank,rank)
ORDER BY hidden_rank, rank;

Je vais essayer de créer un SQLFiddle dans quelques minutes ici, juste pour m'assurer de ne pas me tromper dans certaines de mes requêtes.:P

MODIFIER:J'ai fait une petite erreur.J'essaie de le nettoyer dans un exemple au moment où nous parlons.

MODIFIER 2 :L'erreur est maintenant corrigée !Malheureusement, SQLFiddle rencontre quelques difficultés en ce moment, mais ICI est le lien vers SQLFiddle pour certains tests.

Veuillez noter que je n'ai peut-être pas résolu ce problème de la manière la plus élégante possible, mais cela devrait résoudre vos problèmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top