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 :

[2000] Un "casse tete" de requete :) Jointure avec conditions


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut [2000] Un "casse tete" de requete :) Jointure avec conditions

    Jai une table "Clients" contenant lensemble de mes clients:
    Client_ID
    sensible (0 ou -1)

    Jai une table "Incidents"
    l'ID du client
    description
    et un champ Oui/Non "resolu".

    Quand un incident survient chez un client il est ajoute a la table incidents avec resolu = 0. On change la valeur de resolu une fois le probleme regle.
    Ainsi un client peut navoir aucun incident , ou encore avoir un ou plusieurs incidents qui pourrons etre resolu ou pas.

    Jaimerais une requete qui me donne lensemble des clients sensible (sensibles= -1) avec leurs incidents respectifs non resolu (resolu =0)
    sils en ont
    Je mexplique
    -Si un client sensible na pas dincidents du tout il apparaitra sur une ligne avec la description de lincident vide (A)
    -Pareil si un client sensible a des incidents mais tous sont resolus il apparaitra sur une ligne avec la description de lincident vide (B)
    -De plus si un client sensible a un ou plusieurs incident NON resolus il apparaitra sur plusieurs ligne avec sur chaque ligne la description de l'un de ses incidents non resolus. (C)

    Jai trouve une requete qui me donnent (A), une autre requete qui me donnent (C) mais je bloque sur le cas (B).
    Merci a tous
    desole davoir ete long
    A+

    NB: en fait la jointure gauche sur clients et incidents ne me donne que les clients ayant au moins un incidents NON resolus du fait du test sur le champ resolu de la table incidents

  2. #2
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Salut !

    Quelle est la requête que tu utilises pour l'instant et que te donne-t'elle comme résultat ?

    Bernard.

  3. #3
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Pour que ça soit plus simple, je dirai avec une sous-requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT Clients.Client_ID, SR_Incidents.description
    FROM Clients LEFT JOIN
      (SELECT Client_ID, description FROM Incidents WHERE resolu=False) As SR_Incidents
          ON Clients.Client_ID=SR_Incidents.Client_ID
    WHERE (Clients.sensible = -1)

    ou une requête des incidents non résolus que l'on utilise côté droit de la jointure dans la requête.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT Clients.Client_ID, R_Incidents_NR.description
    FROM Clients LEFT JOIN R_Incidents_NR ON Clients.Client_ID=R_Incidents_NR.Client_ID
    WHERE (Clients.sensible = -1)
    avec
    Code sql de Requête R_Incidents_NR : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Client_ID, description FROM Incidents WHERE resolu=False
    A+

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut Ca marche
    salut
    la solution donne par LedZeppII marche dans lexemple donne MAIS PAS DANS MON CAS REEL (cf post suivant)
    voici la requete que javais mais qui exclu les clients nayant pas de requete et ceux ayant toutes leurs requetes resolus.
    La requete ci dessus ne marche donc pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Clients.Client_ID, Incidents.Description
    FROM Clients LEFT JOIN Incidents ON Clients.Client_ID = Incidents.Client_ID
    WHERE (((Clients.Sensible)=-1) AND ((Incidents.Resolu)=0));
    Si quelqun pourrait me confirmer que cela ne marche pas du fait que le test sur "resolu" se fait dans la requete principale et que certains clients sensibles ayant ce champs NULL ne repondent pas au critere et sont donc exclu du resultat ????

    Merci encore a toi et Bernard
    A+

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut NE MARCHE PAS avec mon cas reel
    Voici ma requete appliquee a mon cas reel
    mais jai une erreur dans la clause FROM.
    Cette errreur apparait quand jutilise cette requete comme source dun formulaire ou quand jessaie dordonner le resultat en utilisant le bouton "A->Z"
    Une idee ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT Clients.[Clients Num], SR_Incidents.Comments
    FROM Clients LEFT JOIN (SELECT [Clients Num]  FROM  ClientsIncidents WHERE  ((ClientsIncidents .Closed)=0)) AS SR_Incidents ON Clients.[Clients Num] = SR_Incidents.[Clients Num]
    WHERE (((Clients.Sensible)=-1));

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    J'ai remarqué dans certains cas qu'Access ne supporte pas les sous-requête utilisées à la place d'une table.

    Tu aura peut-être remarqué que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ....
    FROM TABLE1 LEFT JOIN (sous-requête) As TABLE2 ON ....
    est transformé par Access en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ....
    FROM TABLE1 LEFT JOIN [sous-requête]. As TABLE2 ON ....
    La sous-requête n'est plus entre parenthèses mais entre crochets droits.
    Si la sous-requête a des noms entre crochets droits (table ou champ) on peut obtenir une erreur de syntaxe.

    Tu ne devrais pas avoir ce problème si tu utilises ma deuxième proposition, à savoir sauvegarder la sous-requête en tant que requête Access.


    Concernant ton post précédent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((Clients.Sensible)=-1) AND ((Incidents.Resolu)=0))
    élimine le cas où Resolu est Null.
    On peut l'améliorer avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((Clients.Sensible)=-1) AND ((Incidents.Resolu)=0) OR ((Incidents.Resolu) Is Null));
    Mais ça ne sortira pas les Clients dont tous les problèmes sont résolus.

    A+

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut PARFAIT
    En effet je lavais remarque est vu que jai plusieurs champ dont le nom contient un espace je suis passe par une sous requete et ca a marche.


    Tu as donc parfaitement raison meme si vu mon manque dexperience je navais pas eu ce cas auparavant.
    Pareil pour ma requete qui ne marchait pas, merci pour lamelioration et la comprehension.
    Merci encore
    A+

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

Discussions similaires

  1. requete calcul avec conditions
    Par boulou85 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 18/03/2008, 15h01
  2. requete ajout avec condition
    Par mnssylvain dans le forum Requêtes et SQL.
    Réponses: 23
    Dernier message: 26/10/2007, 16h15
  3. casse tete sur une requete - probleme de Séléction
    Par tatayoyo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/03/2007, 19h32
  4. [Access] requete sql avec condition sur date
    Par qeja dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/03/2006, 23h54

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