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 :

Requête de non correspondance


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    comptable
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : comptable
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Requête de non correspondance
    Bonjour,

    Je souhaite créer une requête de non correspondance entre 2 tables tout en faisant ressortir les personnes ayant le même nom. Concrètement, j'ai une table avec mes adhérents 2012 et une autre avec mes adhérents 2013. Je souhaite faire apparaître dans une requête mes adhérents ayant renouvelés mais qui n'ont pas racheté le même produit. J'arrive à faire ressortir le nom des adhérents qui ont renouvelé mais je n'arrive pas à faire ressortir ceux qui n'ont pas racheté le même produit.
    Voici ma requête en sql :

    Code sql : 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
    18
    19
    20
    SELECT [72_adhérents_2013].Produit,
           [72_adhérents_2013].Nom,
           [72_adhérents_2013].Prenom,
           [72_adhérents_2013].[Date de Naissance],
           [72_adhérents_2012].Produit,
           [72_adhérents_2012].Nom,
           [72_adhérents_2012].Prenom,
           [72_adhérents_2012].[Date de Naissance]
    FROM   72_adhérents_2013
           LEFT JOIN 72_adhérents_2012
                  ON ( [72_adhérents_2013].[Date de Naissance] =
                                 [72_adhérents_2012].[Date de Naissance] )
                     AND ( [72_adhérents_2013].Prenom = [72_adhérents_2012].Prenom )
                     AND ( [72_adhérents_2013].Nom = [72_adhérents_2012].Nom )
                     AND ( [72_adhérents_2013].[Produit] =
                           [72_adhérents_2012].[Produit] )
    WHERE  ( ( ( [72_adhérents_2012].Produit ) IS NULL )
             AND ( ( [72_adhérents_2012].Nom ) > "1" )
             AND ( ( [72_adhérents_2012].Prenom ) > "1" )
             AND ( ( [72_adhérents_2012].[Date de Naissance] ) > 1 ) );


    Je saute certainement une étape mais n'ayant pas pratiqué access depuis 10 ans, je suis un peu perdue

    Merci à tous pour votre aide

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Points : 134
    Points
    134
    Par défaut
    Bonjour,
    vous avez deux tables : 72_adhérents_2013 et 72_adhérents_2012

    L'identifiant n° i (i=22 par exemple) correspond-il à la même personne dans les deux tables?
    Ex :
    2013
    1 Paul
    2 Claude
    3 Monique
    4 Michel

    2012
    2 Claude
    4 Michel
    5 Claudine
    6 Raymond

    Si oui, cela signifie que seuls Claude et Michel sont restés adhérents entre 2012 et 2013 même si on ne sait pas encore s'ils ont opté pour le même produit.
    La base de données est-elle ainsi faite ?

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    comptable
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : comptable
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par granchef Voir le message
    Bonjour,
    vous avez deux tables : 72_adhérents_2013 et 72_adhérents_2012

    L'identifiant n° i (i=22 par exemple) correspond-il à la même personne dans les deux tables?
    Ex :
    2013
    1 Paul
    2 Claude
    3 Monique
    4 Michel

    2012
    2 Claude
    4 Michel
    5 Claudine
    6 Raymond

    Si oui, cela signifie que seuls Claude et Michel sont restés adhérents entre 2012 et 2013 même si on ne sait pas encore s'ils ont opté pour le même produit.
    La base de données est-elle ainsi faite ?
    Ma table ressemble à ça :
    Type de produit Produit Numero Nom Prenom Adresse CP Ville Email Tel Fixe Portable Date de Naissance


    Mon numéro peut varier d'une année à l'autre selon le lieu où mon adhérent a acheté sa cotisation, c'est pourquoi j'ai déterminé qu'une personne ayant le même nom, même prénom et même date de naissance d'une année à l'autre était la même personne.

    Est ce que cela vous aide pour répondre à ma demande ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Points : 134
    Points
    134
    Par défaut
    Faire ressortir ceux qui n'ont pas racheté le même produit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.*,B.* from 72_adhérents_2013 as A, 72_adhérents_2012 AS B 
    WHERE
    A.nom=B.nom AND
    A.prenom=B.prenom AND
    A.ddn=B.ddn AND
     A.produit <>B.produit;
    Ce petit truc marche chez moi. Et chez vous?
    Une personne peut-elle souscrire plus d'un produit par an?

    Par contre si l'un des champs (nom, prenom, ddn ) est écorché, la ligne ne remontra pas ou au contraire si le champ produit est écorché elle est susceptible de remonter pour rien...

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    comptable
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : comptable
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par granchef Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.*,B.* from 72_adhérents_2013 as A, 72_adhérents_2012 AS B 
    WHERE
    A.nom=B.nom AND
    A.prenom=B.prenom AND
    A.ddn=B.ddn AND
     A.produit <>B.produit;
    Ce petit truc marche chez moi. Et chez vous?
    Une personne peut-elle souscrire plus d'un produit par an?

    Par contre si l'un des champs (nom, prenom, ddn ) est écorché, la ligne ne remontra pas ou au contraire si le champ produit est écorché elle est susceptible de remonter pour rien...
    Merci beaucoup ça marche chez moi également
    En effet, un adhérent peut souscrire à plus d'un produit par an voir même plusieurs fois le même produit, il s'agit de cotisation soit annuelle en principe une seule fois par an, hebdomadaire ou journalière donc renouvelable.

    Je vais m'attaquer maintenant à une requête count à partir de cette base.

    Merci encore

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Points : 134
    Points
    134
    Par défaut
    En effet, un adhérent peut souscrire à plus d'un produit par an voir même plusieurs fois le même produit, il s'agit de cotisation soit annuelle en principe une seule fois par an, hebdomadaire ou journalière donc renouvelable.
    Si tel est le cas, ça se complexifie. Avec cette requête si toto a pris le produit A en février 2012, le produit B en novembre 2012, le produit A en janvier 2013 et le produit B en septembre 2013, toto remonte deux fois alors qu'il ne devrait pas remonter du tout, il a pris les deux produits, non?

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    comptable
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : comptable
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par granchef Voir le message
    Si tel est le cas, ça se complexifie. Avec cette requête si toto a pris le produit A en février 2012, le produit B en novembre 2012, le produit A en janvier 2013 et le produit B en septembre 2013, toto remonte deux fois alors qu'il ne devrait pas remonter du tout, il a pris les deux produits, non?
    Effectivement, j'ai créé un adhérent dans ce cas là et du coup il ressort 2 fois.

    Du coup, je coince de nouveau : une idée ?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Points : 134
    Points
    134
    Par défaut
    Je cherche une solution avec des requêtes SQL et ce n'est pas facile !
    Compte tenu de mes connaissances, je passerai tout de suite à un code vba avec des recordsets, connaissez-vous ?
    Je reviens vers vous si j'ai une solution...

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    comptable
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : comptable
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par granchef Voir le message
    Je cherche une solution avec des requêtes SQL et ce n'est pas facile !
    Compte tenu de mes connaissances, je passerai tout de suite à un code vba avec des recordsets, connaissez-vous ?
    Je reviens vers vous si j'ai une solution...
    VBA je ne connais pas du tout.

    En tout cas encore merci pour votre aide, je vais de mon côté essayer de "bidouiller" quelque chose avec les doublons

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Points : 134
    Points
    134
    Par défaut
    En 6 requêtes et en ajoutant une variable annee dans chaque table, j'ai peut-être une solution!

    Req1A : Tous les produits par personne pour 2012
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom, produit, annee, count(produit) AS nb FROM T2012 GROUP BY nom, produit, annee;
    Req1B : Tous les produits par personne pour 2013
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom, produit, annee, count(produit) AS nb FROM T2013 GROUP BY nom, produit, annee;
    Req1C : Tous les produits par personne par année
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from Req1A UNION select * from Req1B ORDER BY annee, nom, produit;
    Req1D : Toutes les combinaisons nom et produit ne se répètant pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom, produit FROM Req1C GROUP BY nom, produit HAVING count(produit)<=1;
    Req1E :Toutes les combinaisons nom et produit ne se répétant pas pour 2012 : ici on obtient les personnes qui ne se sont pas du tout réinscrites et les personnes ayant changé de formule, ça peut vous intéresser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT A.nom FROM Req1D AS A, T2012 AS B  WHERE A.nom=B.nom AND A.produit=B.produit;
    Req1F : Parmi les deux types de données une jointure avec 2013 nous permet de retirer les personnes de 2012 qui ne se sont pas réinscrites.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT A.nom FROM Req1E AS A, T2013 AS B WHERE A.nom=B.nom;
    Proposition à étudier plus rigoureusement en imaginant tous les cas particuliers...

  11. #11
    Nouveau Candidat au Club
    Femme Profil pro
    comptable
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : comptable
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Req1E :Toutes les combinaisons nom et produit ne se répétant pas pour 2012 : ici on obtient les personnes qui ne se sont pas du tout réinscrites et les personnes ayant changé de formule, ça peut vous intéresser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT A.nom FROM Req1D AS A, T2012 AS B  WHERE A.nom=B.nom AND A.produit=B.produit;
    Je coince sur cette requête. J'ai rajouté les champs prénom et date de naissance mais rien ne se produit. J'ai rajouté une ligne à mon tableau pour être sûre d'avoir un adhérant ayant qui a choisi 2 formules la même année. C'est peut être le fait que ça soit la même année qui coince.
    Voici ma formule peut-être allez-vous voir d'où vient l'erreur :

    SELECT A.nom, A.prenom, A.[Date de Naissance]
    FROM [Tous les nom et produits ne se répétant pas] AS A, 72_adhérents_2012 AS B
    WHERE (((A.nom)=[B].[nom]) AND ((A.prenom)=[B].[prenom]) AND ((A.[Date de Naissance])=[B].[date de naissance]) AND (([A].[Produit])=[B].[produit]));

    Je vous remercie encore pour votre aide.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Points : 134
    Points
    134
    Par défaut
    La requête a l'air bonne. Pour ma part j'ai reproduit la base de données sans le champ date de naissance et j'obtiens le résultat escompté.
    Pour tester Req1E :
    1/ Mettre une personne (nom, prenom, ddn, produit) dans 2012 MAIS PAS dans 2013.
    2/ Mettre une personne (nom,prenom,ddn,produit="ABC") dans 2012 ET mettre cette même personne avec produit="DEF" dans 2013.

    Les cas 1/ et 2/ devraient ressortir avec Req1E.
    Cela ne fonctionne pas ?

Discussions similaires

  1. "Opération annulée" sur requête de non-correspondance
    Par tedparker dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 23/11/2009, 17h18
  2. Requête de non correspondance et Ajout
    Par gentoo dans le forum Access
    Réponses: 5
    Dernier message: 29/01/2007, 13h52
  3. Requête de non correspondance.
    Par euskal75 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 29/11/2006, 16h47
  4. Réponses: 1
    Dernier message: 28/06/2006, 13h31
  5. Cas spécial de requête de non-correspondance
    Par Floch dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 21/06/2006, 12h19

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