1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    mars 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : mars 2012
    Messages : 17
    Points : 14
    Points
    14

    Par défaut SELECT double condition - notion matricielle

    Bonjour,

    On me demande un extrait de données un peu particulier ; je ne suis pas un as du langage SQL donc j'espère trouver ici une solution.

    Je travaille avec MySQL Workbench ; ci-joint un petit fichier Excel qui résume l'étape d'extraction ou je suis bloqué, dans son état le plus simple possible.
    Une requête me permet donc d'obtenir ces données, mais je souhaiterai aller plus loin :

    Pour chaque individu, je souhaiterai que n'apparaissent que les informations (lignes) dont la date_appel est supérieure ou égale à la date d'appel du dernier appel qui a pour sujet 'APPEL qualite"
    - dans ce cas-ci, on a par exemple Agathe (code 22) qui a reçu un appel qualité le 19 mais aussi le 22/04/2017 ; la concernant, je ne souhaiterai donc que soit sélectionnées que les lignes 18, 19 et 20.


    Merci.
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 251
    Points : 22 082
    Points
    22 082

    Par défaut

    Je n'ai pas accès depuis mon poste à ton document Excel ; je partirai donc d'une table avec la structure (id_personne, date_appel, sujet_appel, autres_attributs).

    Il faut d'abord identifier le dernier appel avec pour sujet 'Appel qualité' pour chaque personne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  id_personne
        ,   MAX(date_appel) AS appel_qualite
    FROM    matable
    WHERE   sujet_appel = 'Appel qualité'
    GROUP BY id_personne
    ;
    Il ne reste plus qu'à lister les appels émis après cette date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  det.*
    FROM    matable AS  det
        INNER JOIN
            (   SELECT  id_personne
                    ,   MAX(date_appel) AS appel_qualite
                FROM    matable
                WHERE   sujet_appel = 'Appel qualité'
                GROUP BY id_personne
            )   AS  ref
            ON  det.id_personne = ref.id_personne
            AND det.date_appel  > ref.appel_qualite
    ;
    Tu n'as pas précisé ce que tu faisais pour les personnes qui n'ont jamais passé d'appel qualité. Elles ne sont pas prises en charge dans cette requête.

    [Edit]
    Tu peux aussi prendre le problème dans l'autre sens et lister seulement les appels qui ne sont pas antérieurs à un appel qualité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  det.*
    FROM    matable AS  det
    WHERE   NOT EXISTS
            (   SELECT  NULL
                FROM    matable AS  ref
                WHERE   ref.sujet_appel = 'Appel qualité'
                    AND ref.id_personne = det.id_personne
                    AND ref.date_appel  >= det.appel_qualite
            )
    ;
    Cette requête liste aussi les appels émis par des personnes qui n'ont n'ont jamais passé d'appel qualité.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    mars 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : mars 2012
    Messages : 17
    Points : 14
    Points
    14

    Par défaut

    Bonjour al1_24, les personnes qui n'ont pas passé d'appels Qualité sont exclues de cette extraction de données. La première partie de ta solution adaptée à ma requête fonctionne parfaitement ! merci beaucoup, tu m'as fait gagné un temps précieux

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

Discussions similaires

  1. jointure de table a double condition sur un select
    Par igorzup dans le forum Langage SQL
    Réponses: 15
    Dernier message: 05/12/2008, 18h41
  2. Probleme Select Case sur Double Condition
    Par Danyel dans le forum VB.NET
    Réponses: 2
    Dernier message: 14/04/2008, 23h37
  3. Un double Select doublé d un "for each" qui coince
    Par Sparal dans le forum Access
    Réponses: 4
    Dernier message: 09/02/2006, 14h00
  4. Select double et insertion dans fichier
    Par Anakior dans le forum PHP & MySQL
    Réponses: 4
    Dernier message: 02/01/2006, 15h11
  5. Réponses: 6
    Dernier message: 08/06/2004, 14h51

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