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

Langage SQL Discussion :

requete SQL qui ne donne pas le bon résultat?


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 21
    Points : 8
    Points
    8
    Par défaut requete SQL qui ne donne pas le bon résultat?
    Bonjour a tous,
    voila c'est pour un exercice de BD pour la gestion d'une bibliothèque
    j'ai 2 tables:

    Emprunt(Personne, livre, dateEmprunt,DateRetourPrevue, DateRetourEffective) qui contient toutes les informations sur les livres empruntés
    et
    Retour(Personne, livre, DateEmprunt, Pénalité retard) qui contient toutes les infos sur les livres rendus en retard

    il faut ecrire une requete SQL qui donne comme resultat:
    Toutes les personnes ayant TOUJOURS rendu en retard les livres qu'elles ont empruntés?

    j'ai essayé avec cette requete mais ça me donne les personnes ayant rendu AU MOINS UNE FOIS un livre en retard et pas TOUJOURS comme l'indique l'énoncé....

    MA REQUETE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select r.personne 
    from retard r 
    where exists (
      select e.personne 
      from emprunt e
    );
    Je voudrais savoir comment corriger ma requete pour qu'elle me donne le bon résultat

    Help!!! ça fait longtemps que je sèche dessus

    Merci beaucoup a ceux qui prendront la peine de me répondre

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Je partirai sur l'inverse de la proposition pour retomber sur mes pattes je penses.

    C-a-d trouver les gens qui n'ont jamais rendu de livre en retard (EXCEPTION JOIN), et entourer tout ceci par une non existence de cet ensemble dans emprunt (NOT EXISTS).

    Ce qui fait quand même 3 jointures.

    edit: en fait non pas d'edit.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    TOUJOURS signifie que le nombre de retards de la personne est égal au nombre d'emprunts de cette personne.

    Tourne-toi du côté de COUNT et de GROUP BY...
    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 !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 239
    Points : 12 866
    Points
    12 866
    Par défaut
    Bonjour,
    Pour reformuler, tu cherches les personnes:
    Qui ont rendu des livres en retard
    Qui n'ont pas rendu de livre "à temps"

    Je verrai quelquechose du genre:

    Autre solution:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select distinct personne
    from emprunt
    where DateRetourPrevue < DateRetourEffective
    except
    select distinct personne
    from emprunt
    where DateRerourPrevue >= DateRetourEffective

    Tatayo.

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Bonjour,

    Je partirai sur l'inverse de la proposition pour retomber sur mes pattes je penses.

    C-a-d trouver les gens qui n'ont jamais rendu de livre en retard (EXCEPTION JOIN), et entourer tout ceci par une non existence de cet ensemble dans emprunt (NOT EXISTS).

    Ce qui fait quand même 3 jointures.

    edit: en fait non pas d'edit.
    oui sauf que le contraire de toujours ce n'est pas jamais mais "au moins une fois"!

  6. #6
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Pour reformuler, tu cherches les personnes:
    Qui ont rendu des livres en retard
    Qui n'ont pas rendu de livre "à temps"

    Je verrai quelquechose du genre:

    Autre solution:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select distinct personne
    from emprunt
    where DateRetourPrevue < DateRetourEffective
    except
    select distinct personne
    from emprunt
    where DateRerourPrevue >= DateRetourEffective

    Tatayo.
    donc en fait tu enleve les personnes qui n'ont pas rendu en retard des personnes qui ont rendu en retard, mais la probleme,je crois, est que si une personne a rendu une fois un livre en retard et a toujours rendu a temps tous les autres livres empruntés et ben elle va faire partie du resultat, et ce n'est pas ce qu'on veux...

    j'ai tort?

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    TOUJOURS signifie que le nombre de retards de la personne est égal au nombre d'emprunts de cette personne.

    Tourne-toi du côté de COUNT et de GROUP BY...
    oui mais pour pouvoir faire cette requete, il faudrait connaitre a l'avance le nom de toutes les personnes de la base non? (pour pouvoir les compter)

  8. #8
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par punkoff Voir le message
    le contraire de "toujours" n'est-il pas "jamais" ? Bref prenez-le comme vous le voulez, mais les 3 solutions mentionnées fonctionnent.
    euh oui...c'est ce que je pensais aussi mais notre prof n'a pas arrété de nous dire que le contraire de tjrs ce n'est pas jamais, pas en sql en tout cas (elle nous a toutefois pas donné la réponse)

    quand vous dites les 3 solutions? desquels vous parlez? celles des précédents posts?

    vous pourriez m'en dire plus s'il vous plait? merci

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par siho90 Voir le message
    oui mais pour pouvoir faire cette requete, il faudrait connaitre a l'avance le nom de toutes les personnes de la base non? (pour pouvoir les compter)
    Il ne s'agit pas de compter les personnes mais les emprunts par personne. Seulement celles qui ont emprunté ; celles qui n'ont pas emprunté n'ont pas non plus rendu en retard donc on s'en fout !

    Je te mets sur la voie...
    Combien d'emprunts par personne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Personne, COUNT(*) AS nb_emprunts
    FROM Emprunt
    GROUP BY Personne
    Je te laisse faire la même chose pour compter les retards par personne, joindre les deux et ne garder que les personnes dont les deux nombres sont égaux.
    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 !

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    euh oui...c'est ce que je pensais aussi mais notre prof n'a pas arrété de nous dire que le contraire de tjrs ce n'est pas jamais, pas en sql en tout cas (elle nous a toutefois pas donné la réponse)

    quand vous dites les 3 solutions? desquels vous parlez? celles des précédents posts?

    vous pourriez m'en dire plus s'il vous plait? merci
    Je me suis rendu compte de mon erreur, du coup ce que j'ai posté est faux.

    Il faut donc prendre le truc a l'envers, enlever de l'ensemble des gens qui ont rendu un livre en retard ceux qui ont au moins une fois redu un livre en temps et en heure.


    C'est ce qu'a posté tatayo.


    La réponse Cinéphil marchera aussi.

  11. #11
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Il ne s'agit pas de compter les personnes mais les emprunts par personne. Seulement celles qui ont emprunté ; celles qui n'ont pas emprunté n'ont pas non plus rendu en retard donc on s'en fout !

    Je te mets sur la voie...
    Combien d'emprunts par personne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Personne, COUNT(*) AS nb_emprunts
    FROM Emprunt
    GROUP BY Personne
    Je te laisse faire la même chose pour compter les retards par personne, joindre les deux et ne garder que les personnes dont les deux nombres sont égaux.
    Merci beaucoup, je viens de tester votre solution et j'ai ecris ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select *  from
    (SELECT Personne, COUNT(*) AS nb_emprunts
    FROM Emprunt
    GROUP BY Personne) A
    inner join
     
    (SELECT Personne, COUNT(*) AS nb_emprunts2
    FROM retard
    GROUP BY Personne) B
    on A.nb_emprunts=B.nb_emprunts2;
    mais je crois qu'il y a une erreur dans ma requete car le compte n'est pas bon pour la table retard, c'est bizarre!!

    je suis désolée de vous déranger encore mais vous pourriez me dire ce qui cloche?

    merci infiniment

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 239
    Points : 12 866
    Points
    12 866
    Par défaut
    Je pense qu'il te manque une jointure dans ta requête...

    Tatayo.

  13. #13
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Je pense qu'il te manque une jointure dans ta requête...

    Tatayo.
    ah oui..?? euh... une jointure sous quelle condition? désolée je ne vois pas

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    J'avais écrit ceci :
    Je te laisse faire la même chose pour compter les retards par personne, joindre les deux et ne garder que les personnes dont les deux nombres sont égaux.
    "ne garder que", c'est une restriction qui s'exprime en SQL par un WHERE.

    Dans ta requête, tu fais la jointure sur le nombre d'emprunts = le nombre de retours.

    Si Jean à 5 emprunts et Jules 5 retours, les deux lignes seront jointes !

    La condition de jointure est à faire sur les personnes et la restriction sur l'égalité des comptes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT A.Personne  
    FROM
    (
        SELECT Personne, COUNT(*) AS nb_emprunts
        FROM Emprunt
        GROUP BY Personne
    ) A
    INNER JOIN 
    (
        SELECT Personne, COUNT(*) AS nb_emprunts2
        FROM retard
        GROUP BY Personne
    ) B ON A.Personne = B.Personne
    WHERE A.nb_emprunts = B.nb_emprunts2
    Au passage, évite la guerre des étoiles !
    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 !

  15. #15
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Ah oui zut c'est vrai...

    ouf ça marche

    génial

    merci infiniment à tous (CinePhil, punkoff et tatayo)

    CinePhil merci encore pour votre idée ça m'enlève vraiment une épine du pied
    (dac o dac pr la "guerre des étoiles"^^ je ferais attention)

    bonne soirée

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

Discussions similaires

  1. [Excel 2007-2010]Requête SQL qui ne donne pas le bon résultat
    Par Davidw dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/10/2012, 11h48
  2. [Access] requete sql qui ne fonctionne pas
    Par pobrouwers dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/03/2007, 12h33
  3. requete sql qui ne fonctionne pas
    Par pobrouwers dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 15/03/2007, 09h37
  4. [MySQL] requete sql qui ne donne pas le bon array
    Par easyjava dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 02/11/2006, 14h41
  5. [hibernate]requete SQL qui ne passe pas
    Par Gromitou dans le forum Hibernate
    Réponses: 8
    Dernier message: 09/06/2006, 12h18

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