IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[Débutant] Ordre de tri


Sujet :

Langage SQL

  1. #1
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut [Débutant] Ordre de tri
    Bonjour,

    La base de données utilisée est MySql.

    J'ai notamment une table `OCCUPANT`, liée à une table `OCCUPATION`.

    Ma demande concerne l'ordre de tri des "occupants".

    Dans une "occupation", il peut y avoir un ou plusieurs "occupants", rattachés à un ou plusieurs "groupes".

    Le premier "groupe" est toujours celui du "preneur de bail", auquel peuvent être rattachés un ou plusieurs autres "occupants", qui sont "à charge" ou non.

    Peuvent suivre un ou plusieurs "groupes" auquel sont rattachés un ou plusieurs "occupants", qui sont également "à charge" ou non.

    Dans un groupe, il peut y avoir plusieurs "occupant à charge", mais un seul "occupant non à charge".

    Pour les identifier, il y a trois colonnes dans la table `OCCUPANT` :
    - `PRENEUR_BAIL` (type BIT) ;
    - `CHEF_GROUPE` (type BIT), le "preneur de bail" étant également "chef de groupe".
    - `PERSONNE_A_CHARGE` (type BIT).

    Les "occupants" qui ne sont pas "chef de groupe", soit ceux qui sont "à charge" ou non sont rattachés à leur "chef de groupe" par l'information `RATTACHE_A` qui contient l'ID du "chef de groupe".

    L'ordre de tri que je désire est (par exemple) le suivant :
    - preneur de bail (chef du premier groupe) ;
    - occupant non à charge ;
    - occupant à charge (tri croissant sur la date de naissance) ;
    - occupant à charge (tri croissant sur la date de naissance) ;
    - occupant à charge (tri croissant sur la date de naissance) ;
    - chef de groupe ;
    - occupant à charge (tri croissant sur la date de naissance) ;
    - occupant à charge (tri croissant sur la date de naissance) ;
    - chef de groupe ;
    - occupant non à charge.

    Et voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT occup.ID
        , loc.ID
        , ...
    INNER JOIN OCCUPATION AS occup
    ON occup.LOGEMENT_ID_FK = log.ID
    INNER JOIN OCCUPANT as loc
    ON occup.ID = loc.OCCUPATION_ID_FK
    WHERE occup.STATUT_OCCUPATION_ID_FK = 5
        AND occup.DATE_FIN_BAIL IS NULL
    ORDER loc.PRENEUR_BAIL DESC
        , loc.CHEF_GROUPE ASC
        , loc.PERSONNE_A_CHARGE ASC
        , loc.RATTACHE_A ASC
        , loc.DATE_NAISSANCE ASC;
    Elle ne fonctionne pas correctement, car si l'ordre du premier "groupe" est en ordre, ce n'est pas le cas des suivants.

    En effet, dans ceux-ci, les "occupants non à charge" sont placés avant le "chef de groupe".

    Je n'en ai pas la certitude, mais je ne pense pas qu'il soit possible d'effectuer ce tri avec une seule jointure, mais je ne vois pas bien comment faire.

    Pouvez-vous m'aider ?

    Un grand merci d'avance.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Déjà il y a une incohérence dans "l'énoncé":
    Citation Envoyé par Domi2 Voir le message
    Bonjour,
    Dans un groupe, il peut y avoir plusieurs "occupant à charge", mais un seul "occupant à charge".
    Sinon pour faire ce genre de tri, j'ai pris pour habitude d'ajouter une ou plusieurs colonnes calculées dans le SELECT, par exemple avec des DECODE et de trier sur ces colonnes.
    Dans ton cas j'ajouterai donc ces colonnes:
    • Chef de groupe ? Oui = 1, non = 0
    • Occupant à charge ? Oui = 1, non = 0
    • Preneur de bail ? Oui = 1, non = 0
    • etc...


    Il suffit alors de regarder le résultat de la requête, et le tri devient évident.

    Tatayo.

  3. #3
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour et merci,

    Effectivement, il faut lire :

    Citation Envoyé par Domi2 Voir le message
    Bonjour,
    Dans un groupe, il peut y avoir plusieurs "occupant à charge", mais un seul "occupant non à charge".
    Je ne connais pas la fonction DECODE, elle n'est pas vraiment standard en SQL et ne semble pas utilisable avec MySQL, ni sous PostgreSQL (base de données vers laquelle on pourrait migrer dans un futur proche), mais peut-être que je me trompe.

    Une autre solution ou plus de précisions sur la fonction DECODE ?
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Effectivement, MySQL ne connaît pas décode... Tu peux la remplacer par un CASE, qui lui est (à priori ) plus standard:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select (case when MaColonne = true then 1 else 0 end) as rang
    from MaTable
    Order by 1

  5. #5
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Je suis effectivement en train d'essayer avec CASE.

    Je ne suis toutefois pas sûr que cela résolve mon ordre de tri.

    Je te redis.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  6. #6
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    J'ai enfin pu faire quelques essais.

    Pour l'instant, le code le plus adapté semble celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CASE
        WHEN loc.PRENEUR_BAIL = TRUE THEN 1
        WHEN loc.PRENEUR_BAIL = FALSE AND loc.CHEF_GROUPE = TRUE THEN loc.ID
        WHEN loc.PERSONNE_A_CHARGE = FALSE THEN loc.RATTACHE_A + 1
        WHEN loc.PERSONNE_A_CHARGE = TRUE THEN loc.RATTACHE_A + 2
    END AS rang
    Cela répond pour une petite partie au problème, notamment si l'ordre de saisie "logique" des occupants a été respecté.

    Ce qui n'est malheureusement pas toujours le cas.

    Je réfléchis à faire éventuellement une colonne "sous-rang"...
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    En fait dans ma logique je voyais plutôt un décodage de chaque colonne impliquée, puis soit un tri sur l'ensemble de ces colonnes, soit sur la somme de ces colonnes.
    Pour ma part je préfère la première méthode, vu qu'elle permet ensuite de changer le tri dans l'application si les colonnes sont bien "mémorisées".

    Tatayo.

  8. #8
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    C'est aussi à cela que je réfléchis, mais je n'arrive pas bien à "visualiser" la chose.

    En fait, c'est uniquement le rang des "chefs de groupe" qui ne sont pas "preneur de bail" qui pose un problème.

    En effet, leur colonne `RATTACHE_A` est NULL. Si elle contenait l'ID du "preneur de bail", ce serait simple...
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Tu peux nous donner un exemple (jeu de test et résultat attendu) ?
    Ainsi on pourra travailler sur du concret.

    Tatayo.

  10. #10
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Voici un exemple :

    ID PRENEUR_BAIL CHEF_GROUPE PERSONNE_A_CHARGE RATTACHE_A NOM PRENOM
    1 true true false null Preneur bail
    2 false false true 1 Personne à charge
    3 false false true 1 Personne à charge
    4 false false true 1 Personne à charge
    5 false true false null Chef groupe
    6 false false true 5 Personne à charge

    Ceci, c'est l'ordre logique de la saisie, et ce devrait être l'ordre de tri qui devrait être respecté dans tous les cas.

    Mais j'ai constaté des cas ou elle n'est pas respectée.

    Par exemple, le chef de groupe pourrait avoir été saisi en premier.

    ID PRENEUR_BAIL CHEF_GROUPE PERSONNE_A_CHARGE RATTACHE_A NOM PRENOM
    1 false true false null Chef groupe
    2 true true false null Preneur bail
    3 false false true 2 Personne à charge
    4 false false true 2 Personne à charge
    5 false false true 2 Personne à charge
    6 false false true 1 Personne à charge

    Et dans ce cas... Je n'ai pas vraiment d'idée.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Tu peux déjà ajouter dans le résultat une colonne GROUPE qui donne l'Id de rattachement, et l'ID pour les chefs de groupe. En triant sur cette colonne, tu "regroupes" les lignes.
    Il "suffit" alors d'ajouter un second tri sur "CHEF_GROUPE", avec en premier les lignes à TRUE.
    GROUPE ID PRENEUR_BAIL CHEF_GROUPE PERSONNE_A_CHARGE RATTACHE_A NOM PRENOM
    1 1 true true false null Preneur bail
    1 2 false false true 1 Personne à charge
    1 3 false false true 1 Personne à charge
    1 4 false false true 1 Personne à charge
    5 5 false true false null Chef groupe
    5 6 false false true 5 Personne à charge

    Tatayo.

  12. #12
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour Tatayo,

    Merci pour la piste à suivre.

    Très rapidement, j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    , CASE
          WHEN loc.CHEF_GROUPE = TRUE THEN loc.ID
          WHEN loc.CHEF_GROUPE = FALSE THEN loc.RATTACHE_A
      END AS groupe
    ...
    ORDER loc.PRENEUR_BAIL DESC
        , groupe
        , loc.CHEF_GROUPE DESC
        , loc.PERSONNE_A_CHARGE ASC
        , loc.DATE_NAISSANCE ASC;
    Cela couvre la résolution de certaines anomalies potentielles dans l'ordre de saisie des occupants, car les groupes sont maintenant bien définis.

    Toutefois, cela ne résoud pas l'anomalie principale que j'ai constatée, à savoir qu'un "chef de groupe" qui n'est pas "preneur de bail" et qui a une ID inférieur à celui-ci voit sont groupe placé en tête du tri.

    Il faut que je regarde cela de plus près.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  13. #13
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour,

    Après quelques jours de "break", j'ai finalisé cette requête.

    L'ordre de tri est en ordre !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        , CASE
              WHEN loc.CHEF_GROUPE = TRUE THEN loc.PRENEUR_BAIL
              WHEN loc.CHEF_GROUPE = FALSE THEN (SELECT sub.PRENEUR_BAIL FROM OCCUPANT AS sub WHERE sub.ID = loc.RATTACHE_A)
          END AS GROUPE_PRINCIPAL
        , CASE
              WHEN loc.CHEF_GROUPE = TRUE THEN loc.DATE_NAISSANCE
              WHEN loc.CHEF_GROUPE = FALSE THEN (SELECT sub.DATE_NAISSANCE FROM OCCUPANT AS sub WHERE sub.ID = loc.RATTACHE_A)
          END AS TRI_GROUPE
    ...
    ORDER BY ...
        , ...
        , ...
        , GROUPE_PRINCIPAL DESC
        , TRI_GROUPE ASC
        , loc.CHEF_GROUPE DESC
        , loc.PERSONNE_A_CHARGE ASC
        , loc.DATE_NAISSANCE ASC;
    Merci pour l'aide.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Ordre d'affichage, 2D
    Par YéTeeh dans le forum OpenGL
    Réponses: 4
    Dernier message: 13/06/2005, 19h51
  2. [SQL2K]URGENT: récupérer jeu de caractères et ordre de tri ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/04/2005, 11h43
  3. [débutant] Ordre des champs de saisie par la touche tab
    Par almisuifre dans le forum C++Builder
    Réponses: 10
    Dernier message: 03/03/2005, 19h45
  4. Ordre des tris / fonction upper
    Par slylafone dans le forum Débuter
    Réponses: 7
    Dernier message: 18/01/2005, 17h53
  5. Réponses: 7
    Dernier message: 20/10/2004, 08h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo