1. #1
    Membre du Club
    Profil pro
    Inscrit en
    juin 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 111
    Points : 51
    Points
    51

    Par défaut Récupérer des lignes selon critères

    Bonjour
    J'ai une table avec les enregistrements suivant :

    NOM CHEMIN STATUS
    TOTO PATH_1 EN COURS
    TOTO PATH_2 OK
    BOB PATH_3 EN COURS
    YVES PATH_4 EN COURS
    YVES PATH_5 OK
    MICHEL PATH_6 OK


    Et je souhaiterais récupérer le PATH pour les NOM qui ont à la fois "EN COURS" et "OK"
    Quel est la requête à faire?

    Merci beaucoup

  2. #2
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    15 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 15 182
    Points : 29 310
    Points
    29 310
    Billets dans le blog
    4

    Par défaut

    On veut bien vous aider mais pas faire à votre place.
    Qu'avez-vous essayé comme requête ?

    Indice : Il s'agit de compter les lignes par nom dont le status est dans l'ensemble ('EN COURS', 'OK') et ne retenir que les noms qui ont deux lignes et enfin joindre ce résultat à la table pour récupérer les PATH de ces noms.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    juin 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 111
    Points : 51
    Points
    51

    Par défaut

    Bonjour
    J'ai fait un peu comme toi, et je ne veux pas que l'on bosse pour moi.
    Mais j'aurais voulu connaitre si il y avait une requête simple (avec jointure ou autre) que je ne maîtrise pas bien.

  4. #4
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    15 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 15 182
    Points : 29 310
    Points
    29 310
    Billets dans le blog
    4

    Par défaut

    Et bien commencez par essayer de faire la requête pour laquelle j'ai donné l'indice car le SQL se lit comme une phrase et proposez-nous vos essais si vous n'y arrivez pas ; nous corrigerons.
    C'est en faisant qu'on apprend.

    Commencez par le début de l'indice :
    Il s'agit de compter les lignes par nom dont le status est dans l'ensemble ('EN COURS', 'OK')
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 000
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 000
    Points : 6 585
    Points
    6 585
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Lebas Voir le message
    Bonjour
    J'ai une table avec les enregistrements suivant :

    NOM CHEMIN STATUS
    TOTO PATH_1 EN COURS
    TOTO PATH_2 OK
    BOB PATH_3 EN COURS
    YVES PATH_4 EN COURS
    YVES PATH_5 OK
    MICHEL PATH_6 OK


    Et je souhaiterais récupérer le PATH pour les NOM qui ont à la fois "EN COURS" et "OK"
    Dans l'extrait que vous communiquez le chemin est différent pour une même personne ayant le statut "OK" et le statut "EN COURS"
    Du coup il faut également préciser le résultat attendu : faut il restituer un seul chemin ? dans ce cas lequel ? faut il concaténer les deux ? dans quel ordre ?...

  6. #6
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 000
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 000
    Points : 6 585
    Points
    6 585
    Billets dans le blog
    1

    Par défaut

    Pour compléter ce qui précède, puisque vous n'avez pas mis en résolu

    Vous cherchez l'intersection entre
    A = l'ensemble des personnes qui ont un chemin "en cours"
    et
    B = l'ensemble des personnes qui ont un chemin "OK"

    Voici différentes façons de trouver cette intersection :

    - utiliser une jointure inner explicite avec INNER JOIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Col1, Col2, ..., Coln
    FROM       ma_table T1
    INNER JOIN ma_table T2
       ON T2.nom = T1.nom
    where T1.status = 'EN COURS'
      and T2.status = 'OK'
    - utiliser une jointure inner implicite avec LEFT ou RIGHT (OUTER) JOIN et une restriction sur l'une des colonnes "not null" de la table OUTER.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Col1, Col2, ..., Coln
    FROM      ma_table T1
    LEFT JOIN ma_table T2
       ON T2.nom = T1.nom
    where T1.status = 'EN COURS'
      and T2.status = 'OK'
      and T2.Col1 is not null
    Cette deuxième méthode n'en est pas vraiment une, c'est plutôt un piège dans lequel tombent fréquemment ceux qui n'ont pas bien compris le principe d'une jointure externe

    - verifier l'existence de chaque élément de A dans B en utilisant une sous-requête corrélée avec EXISTS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT Col1, Col2, ..., Coln
    FROM       ma_table T1
    where T1.status = 'EN COURS'
      and exists
         (select 1
          from ma_table T2
          where T2.nom = T1.nom
            and T2.status = 'OK')
    - vérifier l'existence de chaque élément de A dans B en utilisant une sous-requête corrélée avec IN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Col1, Col2, ..., Coln
    FROM       ma_table T1
    where T1.status = 'EN COURS'
      and T1.nom in
         (select T2.nom
          from ma_table T2
          where T2.status = 'OK')
    - dans certains cas on peut également utiliser INTERSECT, mais ce n'est pas adapté ici : vous avez besoin de récupérer le chemin qui est différent dans les deux ensembles

    D'autres solutions sont possibles : on peut faire mumuse avec EXCEPTpar exemple, mais dans un but purement didactique (ensemble de toutes les personnes sauf celles qui n'ont pas de OK ou qui n'ont pas de "en cours" )

  7. #7
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 385
    Points : 40 291
    Points
    40 291
    Billets dans le blog
    1

    Par défaut

    Encore une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM   ma_table
    WHERE mac_clef 
    IN
    (
    SELECT ma_clef
    FROM      ma_table T1
    GROUP  BY ma_clef
    HAVING COUNT(DISTINCT STATUS) > 1
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

Discussions similaires

  1. sql concatener des lignes d'une requete
    Par sak_ura dans le forum Développement
    Réponses: 6
    Dernier message: 11/07/2014, 14h44
  2. [Toutes versions] Macro pour sélectionner des lignes selon un critère
    Par logoyvelines dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/09/2011, 11h20
  3. Réponses: 2
    Dernier message: 15/02/2010, 02h07
  4. [XL-2003] supprimer des lignes selon critères
    Par collinchris dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/01/2010, 14h51
  5. [E-03] Macro Extraire des Lignes selon critère
    Par willybass dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/03/2009, 08h33

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