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

Requêtes et SQL. Discussion :

Extraire des enregistrements où un champ est répété ET où un autre n'est pas toujours


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Points : 66
    Points
    66
    Par défaut Extraire des enregistrements où un champ est répété ET où un autre n'est pas toujours
    Bonjour,

    Je suis bloqué avec une requête en SQL sur ACCESS.

    Voici un exemple simplifié de la situation qui me bloque:

    Supposons une table avec 3 champs : AMI (la clé), DEPARTEMENT et COULEUR YEUX.

    Je veux faire une requête qui me sort les enregistrements où le département est répété au moins une fois ET où la couleur des yeux des amis qui y habitent n'est pas toujours la même.

    Dans l'exemple ici, ce sera donc Chantal, Pierre, Igor, Nicolas et Micheline.Je n'arrive pas à coordonner ces 2 conditions.

    Ci joint une copie ecran de la table sous excel et la base access zippée.

    Merci par avance
    MS Excel 2007
    MS Access 2003
    SQL Server Express 2008 R2

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 264
    Points : 19 432
    Points
    19 432
    Billets dans le blog
    63
    Par défaut
    Salut,

    Il doit certainement avoir plus simple avec des DCount:

    essaie quand même ce sql:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT LaTable.AMI, LaTable.DEPARTEMENT, LaTable.[COULEUR YEUX]
    FROM LaTable
    WHERE ((((select count(T.[DEPARTEMENT]) as cpt from LaTable T where T.Departement=LaTable.Departement))>1) AND (((select count(T.[COULEUR YEUX]) as cpt from LaTable T where T.Departement=LaTable.Departement and T.[COULEUR YEUX]=LaTable.[COULEUR YEUX]))<(select count(T.[DEPARTEMENT]) as cpt from LaTable T where T.Departement=LaTable.Departement)));

    Il y a pas mal de parenthèses car j'ai utilisé le QBE

    A+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour à tous et mon ami Denis

    j'en étais là pour ma part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT T.*
    FROM AD_VENDORS_MUS_1_VAT_FOCUS_INTR AS T
    WHERE (SELECT COUNT(CY) FROM (SELECT [Couleur Yeux] As CY, Departement FROM AD_VENDORS_MUS_1_VAT_FOCUS_INTR GROUP BY   [Couleur Yeux], Departement) WHERE Departement=t.Departement)>1;
    Philippe

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 264
    Points : 19 432
    Points
    19 432
    Billets dans le blog
    63
    Par défaut
    Salut Philippe le retour ,

    En effet je ne connaissais pas cette technique de sous sous requête

    A cogiter
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Rebonjour,

    Merci beaucoup à vous deux pour vos réponses. Je suis impressionné par la rapidité et l'efficacité de ce forum

    Je les ai essayées et j'ai quelques questions complémentaires :

    User:

    Dans votre SQL, si je ne me trompe pas, vous créez une deuxième table "T" pour comparer à "LaTable".
    Lorsque vous écrivez : "count(T.[DEPARTEMENT]) AS cpt FROM LaTable T", est ce que cela signifie "définie un compteur cpt sur le nombre de départements"?
    Je ne comprends pas la partie "FROM LaTable T", pourquoi il n'y a pas de virgule entre LaTable et T?

    Philben:

    Si je mets votre condition à =1 au lieu de >1, ce qui signifie "Trouve les enregistrements où la couleur des yeux des amis est toujours la même dans leur département". Mais je trouve aussi le cas où il ný a qu'un seul département. Comment transformer ce SQL pour ne prendre que les départements répétés au moins une fois ?( ici je ne devrais avoir que : Claude, Carole, Francois et Veronique).

    Je renvoie la base ACCESS avec vos propositions ( User : PROPO1, Philben : PROPO2).

    Encore une fois merci mille fois
    MS Excel 2007
    MS Access 2003
    SQL Server Express 2008 R2

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 264
    Points : 19 432
    Points
    19 432
    Billets dans le blog
    63
    Par défaut
    Salut,

    "count(T.[DEPARTEMENT]) AS cpt FROM LaTable T where",

    Ca compte le nombre d'enrg (y compris si les departement se répètent) qui respecte la condition définit dans le where:

    exemple
    dep:
    12
    12

    ca en compte 2

    ----------------------------
    pour:
    LaTable T

    Il s'agit d'une sorte d'Alias: on donne le nom "T" à la table "LaTable" dans la sous-requête pour permettre de comparer les champs de la requête principale avec les champs de la sous requête:

    exemple:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ...WHERE T.Departement=LaTable.Departement

    A+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    re bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Si je mets votre condition à =1 au lieu de >1, ce qui signifie "Trouve les enregistrements où la couleur des yeux des amis est toujours la même dans leur département". Mais je trouve aussi le cas où il ný a qu'un seul département. Comment transformer ce SQL pour ne prendre que les départements répétés au moins une fois ?( ici je ne devrais avoir que : Claude, Carole, Francois et Veronique).
    Si on met =1 cela signifie que l'on souhaite uniquement une seule couleur pour chaque département sans préjuger du nombre d'enregistrement pour ce département qui peut être 1 ou plusieurs.

    Pour ce faire, il faut compter les couleurs par départements et compter le nombre d'enregistrement par département.

    Voici une requête possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT T.*
    FROM LaTable AS T
    WHERE (SELECT Count(*) FROM (SELECT Departement FROM LaTable GROUP BY [Couleur Yeux], Departement) WHERE Departement=T.Departement)=1 AND (SELECT Count(*) FROM LaTable WHERE Departement=T.Departement)>1;
    J'ai, a priori, amélioré la requête initiale en utilisant Count(*) qui est plus rapide que le count sur une colonne et permet aussi de compter les enregistrements ayant une couleur nulle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT T.*
    FROM LaTable AS T
    WHERE (SELECT Count(*) FROM (SELECT Departement FROM LaTable GROUP BY [Couleur Yeux], Departement) WHERE Departement=T.Departement)>1;
    Question performance, il faudra indexer la colonne <departement> qui est impliquée dans les différentes clauses WHERE.

    Philippe

  8. #8
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut les amis philben, User et bienvenu piflechien73,

    on peut encore jouer avec vous ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT t1.*
    FROM
       AD_VENDORS_MUS_1_VAT_FOCUS_INTR AS t1
    INNER JOIN
       AD_VENDORS_MUS_1_VAT_FOCUS_INTR AS t2
    ON (t1.[ID]<>t2.[ID]) AND (t2.[COULEUR YEUX]<>t1.[COULEUR YEUX]) AND (t2.[DEPARTEMENT]=t1.[DEPARTEMENT]);

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bravo Diem, c'est la plus rapide

    Philippe

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Et bien là je dis RESPECT!



    Merci beaucoup à vous trois avec ces 3 approches, qui en plus de me donner des solutions vont me permettre de résoudre à coup sûr d'autres cas.

    Quel beau site aussi!
    MS Excel 2007
    MS Access 2003
    SQL Server Express 2008 R2

  11. #11
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 264
    Points : 19 432
    Points
    19 432
    Billets dans le blog
    63
    Par défaut
    Salut les amis,
    En effet, c'est toujours mieux quand on s'y met à trois...
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    En fait rebonjour ,

    je voudrais étendre le principe de Vodiem sur un autre cas : -sortir les enregistrements où au moins 2 ID vivent dans le même département ET qui ont TOUS la même couleur d'yeux.


    Si je mets

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    (t1.[ID]<>t2.[ID]) AND (t2.[COULEUR YEUX]=t1.[COULEUR YEUX]) AND (t2.[DEPARTEMENT]=t1.[DEPARTEMENT])
    cela ne marche pas car je pourrais avoir 4 ID pour un département avec 2 ID qui ont les yeux bleus et 2 ID qui ont les yeux verts.

    Je ne voudrais garder que les cas où par exemple il y a x ID qui habitent le même département et qui ont tous les yeux verts.

    Est ce réalisable avec cette méthode? Merci par avance
    MS Excel 2007
    MS Access 2003
    SQL Server Express 2008 R2

  13. #13
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    il n'est pas possible de jouer sur la jonction pour obtenir cela.
    la validation de la condition se fait entre deux enregistrement pas entre un enregistrement et plusieurs.

    dans ton premier cas une différence d'enregistrement fait apparaitre l'enregistrement dans le second cas c'est une différence d'un ensemble de comparaison.

    il existe beaucoup de solution possible je ne sais pas celui qui serait le plus pertinent.

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Bonsoir,

    C'est ce qui me semblait mais comme je démarre...
    MS Excel 2007
    MS Access 2003
    SQL Server Express 2008 R2

Discussions similaires

  1. requête pour extraire des caractères d'un champ
    Par hellyjlj dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 13/11/2007, 15h32
  2. [MySQL] Rendre compatibles des enregistrements de plusieurs champs
    Par phoque.r dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 25/06/2007, 10h09
  3. [Conception] Extraire des enregistrements depuis un lien
    Par klerdesign dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/09/2006, 09h25
  4. Réponses: 6
    Dernier message: 11/07/2006, 16h13
  5. somme des enregistrement d'un champ
    Par rostomides dans le forum Bases de données
    Réponses: 5
    Dernier message: 07/04/2006, 19h09

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