Comment prévoir plusieurs possibilités de tri dans une requête

août 2018 modifié dans Requêtes SQL
Voici comment étendre les possibilités de tri.

N.B. Comme modèle de départ, j'ai choisi une requête toute simple, qui affiche les infos de base des lecteurs (localisation, groupe éventuel, nom, prénom, numéro de lecteur et sexe).
Je crois que vous pourrez facilement vous inspirer de ce modèle pour ajouter des options de tri dans d'autres requêtes.

En voici le code
SELECT location_libelle as Localisation,
libelle_groupe AS Groupe,
empr_nom as Nom, empr_prenom as 'Prénom',
empr_cb as 'Numéro',
(CASE empr_sexe WHEN '1' THEN 'M' WHEN '2' THEN 'F' ELSE ' ' END) as Sexe

FROM empr_caddie_content, docs_location, empr
LEFT JOIN empr_groupe ON empr_id = id_empr
LEFT JOIN groupe ON groupe_id = id_groupe

WHERE empr_location = idlocation 

GROUP BY empr_cb

ORDER BY location_libelle,
(CASE (!!choix!!)
WHEN '1' THEN CONCAT(libelle_groupe,' ', empr_nom, ' ', empr_prenom)
WHEN '2' THEN CONCAT(empr_nom, ' ', empr_prenom)
WHEN '3' THEN empr_cb ELSE '' END)


Le tri se fait d'abord sur la localisation (quel que soit l'autre critère choisi), ensuite
Choix 1 : sur une concaténation du nom du groupe éventuel + nom et prénom du lecteur
(La liste affichera donc d'abord les emprunteurs qui ne sont liés à aucun groupe, ensuite les membres des groupes)
Choix 2 : sur une concaténation du nom et du prénom du lecteur
Choix 3 : sur le numéro de lecteur

Configurer les paramètres de la requête




Bon travail !
Anne-Marie Cubat

Requête en ISO et en UTF-8

Réponses

  • août 2018 modifié
    Compléments d'information
    Comment inclure la possibilité d'un tri par ordre ascendant (ASC) ou descendant (DESC)

    Remarque préliminaire
    Il n'est pas toujours indispensable de préciser l'ordre de tri. Par défaut, il est en ordre ascendant donc l'instruction ASC peut être omise.

    Dans le version de base de la requête ci-dessus, tout était trié par ordre ascendant.

    ORDER BY location_libelle,
    (CASE (!!choix!!)
    WHEN '1' THEN CONCAT(libelle_groupe,' ', empr_nom, ' ', empr_prenom)
    WHEN '2' THEN CONCAT(empr_nom, ' ', empr_prenom)
    WHEN '3' THEN empr_cb
    ELSE '' END)

    Supposition :
    • pour les choix 1 et 2, on veut l'ordre ascendant
    • pour le choix 3, on veut l'ordre descendant
    N.B. Je sais que ce tri descendant n'a guère de sens pour les numéros de lecteur, mais je voulais garder l'exemple de départ, pour faciliter la compréhension.

    Si vous voulez combiner des tris, certains par ordre ascendant, d'autres par ordre descendant, il faut regrouper les tris en fonction de l'ordre choisi.

    La fin de la requête devient

    ORDER BY location_libelle,
    (CASE (!!choix!!)
    WHEN '1' THEN CONCAT(libelle_groupe,' ', empr_nom, ' ', empr_prenom)
    WHEN '2' THEN CONCAT(empr_nom, ' ', empr_prenom)
    ELSE '' END)
    ASC,

    (CASE (!!choix!!)
    WHEN '3' THEN empr_cb
    ELSE '' END)
    DESC


    Il y a donc deux "blocs" qui commencent par (CASE (!!choix!!), un pour le tri par ordre ascendant, l'autre pour le tri par ordre descendant.

    Vu que l'instruction ASC peut être sous-entendue (c'est la valeur par défaut), on peut aussi simplifier

    ORDER BY location_libelle,
    (CASE (!!choix!!)
    WHEN '1' THEN CONCAT(libelle_groupe,' ', empr_nom, ' ', empr_prenom)
    WHEN '2' THEN CONCAT(empr_nom, ' ', empr_prenom)
    ELSE '' END),

    (CASE (!!choix!!)
    WHEN '3' THEN empr_cb
    ELSE '' END)
    DESC

    Attention, à la syntaxe ! Ces deux blocs d'instructions doivent être séparés par une virgule
    • celle qui figure après le mot ASC dans la variante n° 1
    • celle qui figure après le mot END) dans la variante n° 2

    Je termine en rappelant une vérité élémentaire : vous pouvez aussi trier le résultat obtenu dans le tableur !

    En général, vous exécutez ce genre de requête dans l'onglet Editions, et vous transférez ensuite le résultat vers le tableur. En cas d'urgence, si vous n'avez pas eu le temps de modifier la requête, pensez à exploiter les nombreuses possibilités de tri offertes par le tableur.

    Cordialement,
    Anne-Marie Cubat


  • août 2018 modifié
    Petite correction de la requête de base présentée dans le 1er message

    J'avais écrit ceci
    FROM empr_caddie_content, docs_location, empr
    LEFT JOIN empr_groupe ON empr_id = id_empr
    LEFT JOIN groupe ON groupe_id = id_groupe

    J'aurais dû écrire ceci
    FROM docs_location, empr
    LEFT JOIN empr_groupe ON empr_id = id_empr
    LEFT JOIN groupe ON groupe_id = id_groupe

    En fait, j'avais choisi au départ une requête qui affichait le contenu d'un panier de lecteurs (d'où la référence à la table empr_caddie_content). J'ai voulu simplifier cette procédure, pour me concentrer sur l'aspect "tri des données".

    Je croyais avoir supprimé toutes les instructions et lignes qui concernaient le panier des lecteurs, mais apparemment j'en avais oublié une !

    Cordialement
    Anne-Marie
  • GENIAL Merci (de retour après 2 mois de vacances... J'ai de la lecture LOL)
Connectez-vous ou Inscrivez-vous pour répondre.